aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--bootstrap/vagrant-onap/.gitignore1
-rw-r--r--bootstrap/vagrant-onap/Vagrantfile36
-rw-r--r--bootstrap/vagrant-onap/doc/source/features/configure_execution.rst74
-rw-r--r--bootstrap/vagrant-onap/doc/source/features/features.rst1
-rw-r--r--bootstrap/vagrant-onap/etc/settings.yaml.development6
-rw-r--r--bootstrap/vagrant-onap/etc/settings.yaml.testing6
-rwxr-xr-xbootstrap/vagrant-onap/lib/aai4
-rwxr-xr-xbootstrap/vagrant-onap/lib/appc8
-rwxr-xr-xbootstrap/vagrant-onap/lib/ccsdk7
-rwxr-xr-xbootstrap/vagrant-onap/lib/dcae8
-rwxr-xr-xbootstrap/vagrant-onap/lib/mr8
-rwxr-xr-xbootstrap/vagrant-onap/lib/mso16
-rwxr-xr-xbootstrap/vagrant-onap/lib/multicloud12
-rwxr-xr-xbootstrap/vagrant-onap/lib/policy8
-rwxr-xr-xbootstrap/vagrant-onap/lib/portal11
-rwxr-xr-xbootstrap/vagrant-onap/lib/robot9
-rwxr-xr-x[-rw-r--r--]bootstrap/vagrant-onap/lib/sdc47
-rwxr-xr-xbootstrap/vagrant-onap/lib/sdnc9
-rwxr-xr-xbootstrap/vagrant-onap/lib/vfc8
-rwxr-xr-xbootstrap/vagrant-onap/lib/vid8
-rw-r--r--bootstrap/vagrant-onap/tests/test_mso10
-rw-r--r--bootstrap/vagrant-onap/tests/test_multicloud9
-rw-r--r--bootstrap/vagrant-onap/tools/Run.ps121
-rwxr-xr-xbootstrap/vagrant-onap/tools/run.sh12
-rw-r--r--test/csit/plans/aai/esr-server/setup.sh61
-rw-r--r--test/csit/plans/aai/esr-server/teardown.sh22
-rw-r--r--test/csit/plans/aai/esr-server/testplan.txt4
-rw-r--r--test/csit/plans/aai/resources/docker-compose.yml5
-rw-r--r--test/csit/plans/aai/resources/setup.sh49
-rw-r--r--test/csit/plans/aai/traversal/docker-compose.yml72
-rw-r--r--test/csit/plans/aai/traversal/setup.sh110
-rw-r--r--test/csit/plans/aai/traversal/teardown.sh27
-rw-r--r--test/csit/plans/aai/traversal/testplan.txt3
-rw-r--r--test/csit/scripts/aai/esr-server/startup.sh21
-rw-r--r--test/csit/tests/aai/esr-server/startup/__init__.robot2
-rw-r--r--test/csit/tests/aai/esr-server/startup/test1.robot15
-rw-r--r--test/csit/tests/aai/resources/api_suite/ems.robot65
-rw-r--r--test/csit/tests/aai/resources/api_suite/thirdparty_sdnc.robot65
-rw-r--r--test/csit/tests/aai/resources/api_suite/vim.robot65
-rw-r--r--test/csit/tests/aai/resources/api_suite/vnfm.robot65
-rw-r--r--test/csit/tests/aai/resources/db_edge_rule/prevent_delete.robot131
-rw-r--r--test/csit/tests/aai/resources/relationship_suite/relationship_using_related_link.robot110
-rw-r--r--test/csit/tests/aai/traversal/suite1/__init__.robot2
-rw-r--r--test/csit/tests/aai/traversal/suite1/aai.crt70
-rw-r--r--test/csit/tests/aai/traversal/suite1/aai.key32
-rw-r--r--test/csit/tests/aai/traversal/suite1/custom_query_1.robot131
46 files changed, 1361 insertions, 105 deletions
diff --git a/bootstrap/vagrant-onap/.gitignore b/bootstrap/vagrant-onap/.gitignore
index 446d1fb41..3c502a0af 100644
--- a/bootstrap/vagrant-onap/.gitignore
+++ b/bootstrap/vagrant-onap/.gitignore
@@ -7,3 +7,4 @@ lib/files/proxyrc
lib/files/sources.list
openrc
doc/build/
+etc/settings.yaml
diff --git a/bootstrap/vagrant-onap/Vagrantfile b/bootstrap/vagrant-onap/Vagrantfile
index 014f2fda0..c10cb0bc8 100644
--- a/bootstrap/vagrant-onap/Vagrantfile
+++ b/bootstrap/vagrant-onap/Vagrantfile
@@ -1,46 +1,42 @@
# -*- mode: ruby -*-
# vi: set ft=ruby :
-
configuration = {
# Generic parameters used across all ONAP components
- 'public_net_id' => '00000000-0000-0000-0000-000000000000',
'key_name' => 'ecomp_key',
'pub_key' => '',
'nexus_repo' => 'https://nexus.onap.org/content/sites/raw',
+ 'nexus_repo_root' => 'https://nexus.onap.org',
+ 'nexus_url_snapshot' => 'https://nexus.onap.org/content/repositories/snapshots',
'nexus_docker_repo' => 'nexus3.onap.org:10001',
'nexus_username' => 'docker',
'nexus_password' => 'docker',
'dmaap_topic' => 'AUTO',
'artifacts_version' => '1.0.0',
'docker_version' => '1.0-STAGING-latest',
- 'gerrit_branch' => 'master',
-# Parameters for DCAE instantiation
+ # Parameters for DCAE instantiation
'dcae_zone' => 'iad4',
'dcae_state' => 'vi',
'openstack_tenant_id' => '',
'openstack_username' => '',
'openstack_api_key' => '',
'openstack_password' => '',
- 'nexus_repo_root' => 'https://nexus.onap.org',
- 'nexus_url_snapshot' => 'https://nexus.onap.org/content/repositories/snapshots',
- 'gitlab_branch' => 'master',
- 'build_image' => 'True',
- 'pull_docker_image' => 'True',
'odl_version' => '0.5.3-Boron-SR3',
+ # Parameters for enabling features
+ 'build_image' => 'True',
'clone_repo' => 'True',
'compile_repo' => 'False',
- 'enable_oparent' => 'True'
+ 'enable_oparent' => 'True',
+ 'skip_get_images' => 'False',
+ 'skip_install' => 'True'
}
-
box = {
:virtualbox => 'ubuntu/trusty64',
:libvirt => 'sputnik13/trusty64',
:openstack => nil
}
-
nodes = [
{
:name => "aai",
@@ -217,7 +213,6 @@ nodes = [
},
]
-
run_path = 'vagrant_utils/postinstall.sh'
sdc_volume = 'vol1-sdc-data.vdi'
@@ -234,7 +229,7 @@ if File.exist?(vd_conf)
configuration.update(user_conf)
end
-#Set network interface
+# Set network interface
net_interface = 'vboxnet0'
is_windows = Gem.win_platform?
if is_windows
@@ -243,7 +238,7 @@ end
puts "[INFO] Net interface: #{net_interface}"
-#If argument is given use it. Otherwise use Env: DEPLOY_MODE else use default
+# If argument is given use it. Otherwise use Env: DEPLOY_MODE else use default
requested_machine = ARGV[1]
deploy_mode = ENV.fetch('DEPLOY_MODE', 'individual')
@@ -253,14 +248,14 @@ if requested_machine != nil
end
end
-#Catch the status of all machines
+# Catch the status of all machines
if ARGV[0] == 'status' || ARGV[0] == 'destroy'
deploy_mode = 'NA'
end
puts "[INFO] Deploy Mode: #{deploy_mode}"
-#In case of all-in-one or testing clean the nodes list
+# In case of all-in-one or testing clean the nodes list
case deploy_mode
when 'all-in-one'
nodes.select! do |node|
@@ -368,6 +363,7 @@ Vagrant.configure("2") do |config|
if !is_windows
nodeconfig.vm.synced_folder '~/.m2', '/root/.m2/', create: true
end
+
# Set Network
nodeconfig.vm.network :private_network,
:adapter => 2,
@@ -381,7 +377,7 @@ Vagrant.configure("2") do |config|
# Specific settings:
- #Set Storage (For SDC or All-in-one)
+ # Set Storage (For SDC or All-in-one)
if node[:name].include?("all-in-one") || node[:name].include?("sdc")
nodeconfig.vm.provider "virtualbox" do |v|
unless File.exist?(sdc_volume)
@@ -402,9 +398,11 @@ Vagrant.configure("2") do |config|
# Override variables
run_path = 'vagrant_utils/unit_testing.sh'
node[:args] = [test_suite, test_case]
+ else
+ configuration['skip_get_images'] = ENV.fetch('SKIP_GET_IMAGES', configuration['skip_get_images'])
+ configuration['skip_install'] = ENV.fetch('SKIP_INSTALL', configuration['skip_install'])
end
-
if node[:name].include? "vfc"
nodeconfig.vm.provision 'docker'
end
diff --git a/bootstrap/vagrant-onap/doc/source/features/configure_execution.rst b/bootstrap/vagrant-onap/doc/source/features/configure_execution.rst
new file mode 100644
index 000000000..e2da33681
--- /dev/null
+++ b/bootstrap/vagrant-onap/doc/source/features/configure_execution.rst
@@ -0,0 +1,74 @@
+=======================
+Modify execution values
+=======================
+
+In order to provide a flexible plataform that adjusts to different developer
+needs, it has been implemented two mechanism to configure the execution of this
+project.
+
+Settings configuration file
+---------------------------
+
+The first mechanism refers to the process to replace default configuration
+values through a settings configuration file. This file needs to be placed into
+the *./etc* folder and named *settings.yaml*. It must contain the key/pair
+configuration values that will be overriden.
+
+.. note::
+
+ There are sample files (e. g. settings.yaml.development and
+ settings.yaml.testing) placed into the *./etc* folder. Their purpose is to
+ provide a reference of different configurations.
+
+.. end
+
+Configuration values:
+
++------------------+-------------------+---------------------------------------+
+| Key | Values | Description |
++==================+===================+=======================================+
+| build_image | "True" or "False" | Determines if the Docker image is |
+| | | retrieved from public hub or built |
+| | | from source code. |
++------------------+-------------------+---------------------------------------+
+| clone_repo | "True" or "False" | Determines if all the source code |
+| | | repositories of a given component are |
+| | | cloned locally. |
++------------------+-------------------+---------------------------------------+
+| compile_repo | "True" or "False" | Determines if all the source code |
+| | | repositories of a given component are |
+| | | going to be compiled. |
++------------------+-------------------+---------------------------------------+
+| enable_oparent | "True" or "False" | Determines if the OParent project |
+| | | will be used during the maven |
+| | | compilation. |
++------------------+-------------------+---------------------------------------+
+| skip_get_images | "True" or "False" | Determines if the process to build or |
+| | | retrieve docker images of a given |
+| | | component are going to skipped. |
++------------------+-------------------+---------------------------------------+
+| skip_install | "True" or "False" | Determines if the process to start |
+| | | the services of a given component |
+| | | will be started. |
++------------------+-------------------+---------------------------------------+
+
+Parameters
+----------
+
+The **skip_get_images** and **skip_install** are the only two configuration
+values that can be overriden using *-g* and *-i* respectively by the run scripts
+(*./tools/run.sh* and *.\\tools\\Run.ps1*).
+
+.. note::
+
+ The script parameters take precendence of the configuration file.
+
+.. end
+
+.. code-block:: console
+
+ $ ./tools/run.sh sdc -g
+
+.. end
+
+
diff --git a/bootstrap/vagrant-onap/doc/source/features/features.rst b/bootstrap/vagrant-onap/doc/source/features/features.rst
index 949969828..d35c595df 100644
--- a/bootstrap/vagrant-onap/doc/source/features/features.rst
+++ b/bootstrap/vagrant-onap/doc/source/features/features.rst
@@ -9,6 +9,7 @@ Advanced features
openstack.rst
consuming_scripts.rst
+ configure_execution.rst
This chapter explains how to use ONAP on Vagrant Advanced features
like different providers.
diff --git a/bootstrap/vagrant-onap/etc/settings.yaml.development b/bootstrap/vagrant-onap/etc/settings.yaml.development
new file mode 100644
index 000000000..594273b0d
--- /dev/null
+++ b/bootstrap/vagrant-onap/etc/settings.yaml.development
@@ -0,0 +1,6 @@
+build_images: "True"
+clone_repo: "True"
+compile_repo: "False"
+enable_oparent: "True"
+skip_get_images: "False"
+skip_install: "True"
diff --git a/bootstrap/vagrant-onap/etc/settings.yaml.testing b/bootstrap/vagrant-onap/etc/settings.yaml.testing
new file mode 100644
index 000000000..8beb4767d
--- /dev/null
+++ b/bootstrap/vagrant-onap/etc/settings.yaml.testing
@@ -0,0 +1,6 @@
+build_images: "False"
+clone_repo: "False"
+compile_repo: "False"
+enable_oparent: "False"
+skip_get_images: "False"
+skip_install: "False"
diff --git a/bootstrap/vagrant-onap/lib/aai b/bootstrap/vagrant-onap/lib/aai
index 7d87870a0..bd72ae0f3 100755
--- a/bootstrap/vagrant-onap/lib/aai
+++ b/bootstrap/vagrant-onap/lib/aai
@@ -199,5 +199,7 @@ function init_aai {
install_ajsc_aai
_wait_for_sdc
- install_model_loader
+ if [[ "$skip_install" == "False" ]]; then
+ install_model_loader
+ fi
}
diff --git a/bootstrap/vagrant-onap/lib/appc b/bootstrap/vagrant-onap/lib/appc
index 33980aeea..5e3858f16 100755
--- a/bootstrap/vagrant-onap/lib/appc
+++ b/bootstrap/vagrant-onap/lib/appc
@@ -52,6 +52,10 @@ function init_appc {
fi
fi
- get_appc_images
- install_appc
+ if [[ "$skip_get_images" == "False" ]]; then
+ get_appc_images
+ if [[ "$skip_install" == "False" ]]; then
+ install_appc
+ fi
+ fi
}
diff --git a/bootstrap/vagrant-onap/lib/ccsdk b/bootstrap/vagrant-onap/lib/ccsdk
index 6ea829fb5..85cdf4da2 100755
--- a/bootstrap/vagrant-onap/lib/ccsdk
+++ b/bootstrap/vagrant-onap/lib/ccsdk
@@ -44,12 +44,6 @@ function get_ccsdk_images {
pull_onap_image ccsdk-$image-image
done
fi
-
-}
-
-# install_ccsdk() -
-function install_ccsdk {
- echo "pass"
}
# init_ccsdk() - Function that initialize Multi Cloud services
@@ -60,5 +54,4 @@ function init_ccsdk {
compile_ccsdk_repos
fi
fi
- install_ccsdk
}
diff --git a/bootstrap/vagrant-onap/lib/dcae b/bootstrap/vagrant-onap/lib/dcae
index 43da9f59b..3e702d989 100755
--- a/bootstrap/vagrant-onap/lib/dcae
+++ b/bootstrap/vagrant-onap/lib/dcae
@@ -128,6 +128,10 @@ function init_dcae {
fi
_create_config_file
- get_dcae_images
- install_dcae
+ if [[ "$skip_get_images" == "False" ]]; then
+ get_dcae_images
+ if [[ "$skip_install" == "False" ]]; then
+ install_dcae
+ fi
+ fi
}
diff --git a/bootstrap/vagrant-onap/lib/mr b/bootstrap/vagrant-onap/lib/mr
index a137f73bb..f221817fa 100755
--- a/bootstrap/vagrant-onap/lib/mr
+++ b/bootstrap/vagrant-onap/lib/mr
@@ -31,6 +31,10 @@ function init_mr {
if [[ "$clone_repo" == "True" ]]; then
clone_mr_repos
fi
- get_mr_images
- install_message_router
+ if [[ "$skip_get_images" == "False" ]]; then
+ get_mr_images
+ if [[ "$skip_install" == "False" ]]; then
+ install_message_router
+ fi
+ fi
}
diff --git a/bootstrap/vagrant-onap/lib/mso b/bootstrap/vagrant-onap/lib/mso
index 4b209062d..6ff4bbe3e 100755
--- a/bootstrap/vagrant-onap/lib/mso
+++ b/bootstrap/vagrant-onap/lib/mso
@@ -25,8 +25,8 @@ function compile_all_mso_repos {
done
}
-# install_mso() - Installation of mso images
-function install_mso {
+# get_mso_images() - Function that retrieves or create MSO Docker images
+function get_mso_images {
if [[ "$build_image" == "True" ]]; then
export GIT_NO_PROJECT=/opt/
compile_src $src_folder
@@ -34,8 +34,8 @@ function install_mso {
fi
}
-# install_mso_docker_config() - Download and install MSO Docker configuration project
-function install_mso_docker_config {
+# install_mso() - Install MSO Docker configuration project
+function install_mso {
MSO_ENCRYPTION_KEY=$(cat /opt/mso/docker-config/encryption.key)
echo -n "$openstack_api_key" | openssl aes-128-ecb -e -K $MSO_ENCRYPTION_KEY -nosalt | xxd -c 256 -p > /opt/config/api_key.txt
@@ -108,6 +108,10 @@ function init_mso {
fi
fi
- install_mso
- install_mso_docker_config
+ if [[ "$skip_get_images" == "False" ]]; then
+ get_mso_images
+ if [[ "$skip_install" == "False" ]]; then
+ install_mso
+ fi
+ fi
}
diff --git a/bootstrap/vagrant-onap/lib/multicloud b/bootstrap/vagrant-onap/lib/multicloud
index 1126d6146..1c781fed2 100755
--- a/bootstrap/vagrant-onap/lib/multicloud
+++ b/bootstrap/vagrant-onap/lib/multicloud
@@ -25,6 +25,11 @@ function compile_multicloud_repos {
done
}
+# get_multicloud_images() -
+function get_multicloud_images {
+ echo "pass"
+}
+
# install_multicloud() -
function install_multicloud {
echo "pass"
@@ -38,5 +43,10 @@ function init_multicloud {
compile_multicloud_repos
fi
fi
- install_multicloud
+ if [[ "$skip_get_images" == "False" ]]; then
+ get_multicloud_images
+ if [[ "$skip_install" == "False" ]]; then
+ install_multicloud
+ fi
+ fi
}
diff --git a/bootstrap/vagrant-onap/lib/policy b/bootstrap/vagrant-onap/lib/policy
index ce3405614..f43087b1d 100755
--- a/bootstrap/vagrant-onap/lib/policy
+++ b/bootstrap/vagrant-onap/lib/policy
@@ -65,6 +65,10 @@ function init_policy {
fi
fi
- get_policy_images
- install_policy
+ if [[ "$skip_get_images" == "False" ]]; then
+ get_policy_images
+ if [[ "$skip_install" == "False" ]]; then
+ install_policy
+ fi
+ fi
}
diff --git a/bootstrap/vagrant-onap/lib/portal b/bootstrap/vagrant-onap/lib/portal
index 998d6c075..4dc5ef9b8 100755
--- a/bootstrap/vagrant-onap/lib/portal
+++ b/bootstrap/vagrant-onap/lib/portal
@@ -67,6 +67,7 @@ function install_portal {
install_package unzip
unzip -o etc.zip -d /PROJECT/OpenSource/UbuntuEP/
+ _install_mariadb
install_docker_compose
bash portal_vm_init.sh
@@ -88,7 +89,11 @@ function init_portal {
compile_all_portal_repos
fi
fi
- get_portal_images
- _install_mariadb
- install_portal
+
+ if [[ "$skip_get_images" == "False" ]]; then
+ get_portal_images
+ if [[ "$skip_install" == "False" ]]; then
+ install_portal
+ fi
+ fi
}
diff --git a/bootstrap/vagrant-onap/lib/robot b/bootstrap/vagrant-onap/lib/robot
index 34b431a54..ebcca6e6b 100755
--- a/bootstrap/vagrant-onap/lib/robot
+++ b/bootstrap/vagrant-onap/lib/robot
@@ -59,6 +59,11 @@ function init_robot {
compile_robot_repos
fi
fi
- get_robot_images
- install_robot
+
+ if [[ "$skip_get_images" == "False" ]]; then
+ get_robot_images
+ if [[ "$skip_install" == "False" ]]; then
+ install_robot
+ fi
+ fi
}
diff --git a/bootstrap/vagrant-onap/lib/sdc b/bootstrap/vagrant-onap/lib/sdc
index 058048960..c7f79d64d 100644..100755
--- a/bootstrap/vagrant-onap/lib/sdc
+++ b/bootstrap/vagrant-onap/lib/sdc
@@ -66,16 +66,11 @@ function compile_all_sdc_repos {
# get_sdc_images() - Function that retrieves the SDC docker images
function get_sdc_images {
if [[ "$build_image" == "True" ]]; then
- if [[ "$compile_repo" == "True" ]]; then
- compile_src $sdc_src_folder
- fi
build_docker_image $sdc_src_folder/sdc-docker-base
else
- if [["$pull_docker_image" == True]]; then
- for image in backend frontend elasticsearch kibana cassandra sanity; do
- pull_openecomp_image openecomp/sdc-$image
- done
- fi
+ for image in backend frontend elasticsearch kibana cassandra sanity; do
+ pull_openecomp_image openecomp/sdc-$image
+ done
fi
}
@@ -85,28 +80,23 @@ function install_sdc {
local MR_IP_ADDR='10.0.11.1'
_init_data_folders
- cp $sdc_src_folder/sdc-os-chef/environments/Template.json /data/environments
- cp $sdc_src_folder/sdc-os-chef/scripts/docker_run.sh /data/scripts
- cp $sdc_src_folder/sdc-os-chef/scripts/docker_health.sh /data/scripts
- cp $sdc_src_folder/sdc-os-chef/scripts/docker_login.sh /data/scripts
- cp $sdc_src_folder/sdc-os-chef/scripts/docker_clean.sh /data/scripts
- chmod +x /data/scripts/docker_run.sh
- chmod +x /data/scripts/docker_health.sh
- chmod +x /data/scripts/docker_login.sh
- chmod +x /data/scripts/docker_clean.sh
-
+ cp $sdc_src_folder/sdc-os-chef/environments/Template.json /data/environments
+ cp $sdc_src_folder/sdc-os-chef/scripts/docker_run.sh /data/scripts
+ cp $sdc_src_folder/sdc-os-chef/scripts/docker_health.sh /data/scripts
+ cp $sdc_src_folder/sdc-os-chef/scripts/docker_login.sh /data/scripts
+ cp $sdc_src_folder/sdc-os-chef/scripts/docker_clean.sh /data/scripts
+ chmod +x /data/scripts/docker_run.sh
+ chmod +x /data/scripts/docker_health.sh
+ chmod +x /data/scripts/docker_login.sh
+ chmod +x /data/scripts/docker_clean.sh
+
cat /data/environments/Template.json | sed "s/yyy/"$IP_ADDRESS"/g" > /data/environments/$ENV_NAME.json
sed -i "s/xxx/"$ENV_NAME"/g" /data/environments/$ENV_NAME.json
sed -i "s/\"ueb_url_list\":.*/\"ueb_url_list\": \""$MR_IP_ADDR","$MR_IP_ADDR"\",/g" /data/environments/$ENV_NAME.json
sed -i "s/\"fqdn\":.*/\"fqdn\": [\""$MR_IP_ADDR"\", \""$MR_IP_ADDR"\"]/g" /data/environments/$ENV_NAME.json
install_docker
- if [[ "$pull_docker_image" == "True" ]]; then
- docker_openecomp_login
- bash /data/scripts/docker_run.sh -e $ENV_NAME -r $docker_version -p $(echo $nexus_docker_repo | cut -d':' -f2)
- else
- bash /data/scripts/docker_run.sh -e $ENV_NAME -l
- fi
+ bash /data/scripts/docker_run.sh -e $ENV_NAME -l
}
# init_sdc() - Function that initialize SDC services
@@ -118,7 +108,12 @@ function init_sdc {
compile_all_sdc_repos
fi
fi
- get_sdc_images
- install_sdc
+
+ if [[ "$skip_get_images" == "False" ]]; then
+ get_sdc_images
+ if [[ "$skip_install" == "False" ]]; then
+ install_sdc
+ fi
+ fi
_setup_docker_aliases
}
diff --git a/bootstrap/vagrant-onap/lib/sdnc b/bootstrap/vagrant-onap/lib/sdnc
index c6d013b79..22066fdd4 100755
--- a/bootstrap/vagrant-onap/lib/sdnc
+++ b/bootstrap/vagrant-onap/lib/sdnc
@@ -71,6 +71,11 @@ function init_sdnc {
compile_all_sdnc_repos
fi
fi
- get_sdnc_images
- install_sdnc
+
+ if [[ "$skip_get_images" == "False" ]]; then
+ get_sdnc_images
+ if [[ "$skip_install" == "False" ]]; then
+ install_sdnc
+ fi
+ fi
}
diff --git a/bootstrap/vagrant-onap/lib/vfc b/bootstrap/vagrant-onap/lib/vfc
index a87944879..5cf0ed13b 100755
--- a/bootstrap/vagrant-onap/lib/vfc
+++ b/bootstrap/vagrant-onap/lib/vfc
@@ -106,6 +106,10 @@ function init_vfc {
fi
fi
- get_vfc_images
- install_vfc
+ if [[ "$skip_get_images" == "False" ]]; then
+ get_vfc_images
+ if [[ "$skip_install" == "False" ]]; then
+ install_vfc
+ fi
+ fi
}
diff --git a/bootstrap/vagrant-onap/lib/vid b/bootstrap/vagrant-onap/lib/vid
index 55f399ab0..83b530995 100755
--- a/bootstrap/vagrant-onap/lib/vid
+++ b/bootstrap/vagrant-onap/lib/vid
@@ -56,6 +56,10 @@ function init_vid {
fi
fi
- get_vid_images
- install_vid
+ if [[ "$skip_get_images" == "False" ]]; then
+ get_vid_images
+ if [[ "$skip_install" == "False" ]]; then
+ install_vid
+ fi
+ fi
}
diff --git a/bootstrap/vagrant-onap/tests/test_mso b/bootstrap/vagrant-onap/tests/test_mso
index cb7b014dc..deea7bbf8 100644
--- a/bootstrap/vagrant-onap/tests/test_mso
+++ b/bootstrap/vagrant-onap/tests/test_mso
@@ -4,7 +4,7 @@ source /var/onap_tests/_test_base
source /var/onap/mso
covered_functions=(
-"clone_all_mso_repos" "compile_all_mso_repos" "install_mso" "install_mso_docker_config"
+"clone_all_mso_repos" "compile_all_mso_repos" "get_mso_images" "install_mso"
)
# test_clone_all_mso_repos() - Verify the source code retrieve of MSO project
@@ -40,8 +40,8 @@ function test_compile_all_mso_repos {
asserts_file_exist $src_folder/libs/swift-model/target/swift-model-1.1.0-SNAPSHOT.jar
}
-# test_install_mso() - Verify the creation of MSO Docker images
-function test_install_mso {
+# test_get_mso_images() - Verify the creation of MSO Docker images
+function test_get_mso_images {
clone_all_mso_repos
install_mso
@@ -50,8 +50,8 @@ function test_install_mso {
done
}
-# test_install_mso_docker_config - Verify the execution of MSO Docker images
-function test_install_mso_docker_config {
+# test_install_mso - Verify the execution of MSO Docker images
+function test_install_mso {
clone_all_mso_repos
install_mso
install_mso_docker_config
diff --git a/bootstrap/vagrant-onap/tests/test_multicloud b/bootstrap/vagrant-onap/tests/test_multicloud
index 3d60533f7..374272c1c 100644
--- a/bootstrap/vagrant-onap/tests/test_multicloud
+++ b/bootstrap/vagrant-onap/tests/test_multicloud
@@ -4,7 +4,7 @@ source /var/onap_tests/_test_base
source /var/onap/multicloud
covered_functions=(
-"clone_multicloud_repos" "compile_multicloud_repos" "install_multicloud"
+"clone_multicloud_repos" "compile_multicloud_repos" "get_multicloud_images" "install_multicloud"
)
# test_clone_multicloud_repos() - Verify that Multi Cloud repositories are cloned properly
@@ -24,9 +24,16 @@ function test_compile_multicloud_repos {
asserts_file_exist $multicloud_src_folder/openstack/newton/target/multicloud-openstack-newton-1.0.0-SNAPSHOT.zip
}
+# test_get_multicloud_images() -
+function test_get_multicloud_images {
+ clone_multicloud_repos
+ get_multicloud_images
+}
+
# test_install_multicloud() - Verify the built and start of Multi Cloud services
function test_install_multicloud {
clone_multicloud_repos
+ get_multicloud_images
install_multicloud
}
diff --git a/bootstrap/vagrant-onap/tools/Run.ps1 b/bootstrap/vagrant-onap/tools/Run.ps1
index 8e6c94fa7..71e595bd8 100644
--- a/bootstrap/vagrant-onap/tools/Run.ps1
+++ b/bootstrap/vagrant-onap/tools/Run.ps1
@@ -20,6 +20,12 @@ Test case to use in testing mode.
.PARAMETER y
Skips warning prompt.
+.PARAMETER g
+Skips creation or retrieve image process.
+
+.PARAMETER i
+Skips installation service process.
+
.LINK
https://wiki.onap.org/display/DW/ONAP+on+Vagrant
#>
@@ -44,7 +50,17 @@ Param(
[Parameter(Mandatory=$False,HelpMessage="Skips warning prompt.")]
[AllowNull()]
[Switch]
- $y = $false
+ $y = $True
+,
+ [Parameter(Mandatory=$False,HelpMessage="Skips creation or retrieve image process.")]
+ [AllowNull()]
+ [Switch]
+ $skip_get_images = $True
+,
+ [Parameter(Mandatory=$False,HelpMessage="Skips warning prompt.")]
+ [AllowNull()]
+ [Switch]
+ $skip_install = $True
)
if ( -Not "testing".Equals($Command) )
@@ -63,6 +79,9 @@ if ( -Not "testing".Equals($Command) )
}
}
+$env:SKIP_GET_IMAGES=$skip_get_images
+$env:SKIP_INSTALL=$skip_install
+
switch ($Command)
{
"all_in_one" { $env:DEPLOY_MODE="all-in-one" }
diff --git a/bootstrap/vagrant-onap/tools/run.sh b/bootstrap/vagrant-onap/tools/run.sh
index 08eae01e3..9e03384f7 100755
--- a/bootstrap/vagrant-onap/tools/run.sh
+++ b/bootstrap/vagrant-onap/tools/run.sh
@@ -6,6 +6,10 @@ Usage: run.sh Command [-y] [-?]
Optional arguments:
-y
Skips warning prompt.
+ -g
+ Skips creation or retrieve image process.
+ -i
+ Skips installation service process.
-s <suite>
Test suite to use in testing mode.
-c <case>
@@ -23,11 +27,17 @@ test_case="*"
COMMAND=$1
-while getopts "ys:c:" OPTION "${@:2}"; do
+while getopts "ygis:c:" OPTION "${@:2}"; do
case "$OPTION" in
y)
run=true
;;
+ g)
+ export SKIP_GET_IMAGES="True"
+ ;;
+ i)
+ export SKIP_INSTALL="True"
+ ;;
s)
if [ "$COMMAND" != "testing" ] ; then
echo "Test suite should only be specified in testing mode."
diff --git a/test/csit/plans/aai/esr-server/setup.sh b/test/csit/plans/aai/esr-server/setup.sh
new file mode 100644
index 000000000..16e780117
--- /dev/null
+++ b/test/csit/plans/aai/esr-server/setup.sh
@@ -0,0 +1,61 @@
+#!/bin/bash
+#
+# Copyright 2017 ZTE Corporation.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+# Place the scripts in run order:
+
+
+#login to the onap nexus docker repo
+docker login -u docker -p docker nexus3.onap.org:10001
+
+# Start MSB
+docker run -d -p 8500:8500 --name msb_consul nexus3.onap.org:10001/onap/msb/msb_base
+CONSUL_IP=`get-instance-ip.sh msb_consul`
+echo CONSUL_IP=${CONSUL_IP}
+docker run -d -p 10081:10081 -e CONSUL_IP=$CONSUL_IP --name msb_discovery nexus3.onap.org:10001/onap/msb/msb_discovery
+DISCOVERY_IP=`get-instance-ip.sh msb_discovery`
+echo DISCOVERY_IP=${DISCOVERY_IP}
+docker run -d -p 80:80 -e CONSUL_IP=$CONSUL_IP -e SDCLIENT_IP=$DISCOVERY_IP --name msb_internal_apigateway nexus3.onap.org:10001/onap/msb/msb_apigateway
+MSB_IP=`get-instance-ip.sh msb_internal_apigateway`
+echo MSB_IP=${MSB_IP}
+
+# Start esr-server
+docker run -d --name esr-server --env msbDiscoveryIp=${DISCOVERY_IP} --env msbDiscoveryPort=10081 nexus3.onap.org:10001/onap/aai/esr-server
+#source ${SCRIPTS}/aai/esr-server/startup.sh i-esrserver ${MSB_IP} 80
+ESRSERVER_IP=`get-instance-ip.sh esr-server`
+echo ESRSERVER_IP=${ESRSERVER_IP}
+
+# Wait for initialization
+for i in {1..20}; do
+ curl -sS -m 1 ${ESRSERVER_IP}:9518 && curl -sS -m 1 ${MSB_IP}:80 && break
+ echo sleep $i
+ sleep $i
+done
+
+# Wait for initialization
+for i in {1..20}; do
+ HTTP_CODE=`curl -o /dev/null -s -w "%{http_code}" "${MSB_IP}:80/api/aai-esr-server/v1/test"`
+ if [ ${HTTP_CODE} -eq 200 ]; then
+ break;
+ else
+ sleep $i
+ fi
+done
+
+# Pass any variables required by Robot test suites in ROBOT_VARIABLES
+ROBOT_VARIABLES="-v MSB_IP:${MSB_IP} -v ESRSERVER_IP:${ESRSERVER_IP}"
+
+
+
diff --git a/test/csit/plans/aai/esr-server/teardown.sh b/test/csit/plans/aai/esr-server/teardown.sh
new file mode 100644
index 000000000..93f413831
--- /dev/null
+++ b/test/csit/plans/aai/esr-server/teardown.sh
@@ -0,0 +1,22 @@
+#!/bin/bash
+#
+# Copyright 2017 ZTE Corporation.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+# This script is sourced by run-csit.sh after Robot test completion.
+
+kill-instance.sh esr-server
+kill-instance.sh msb_internal_apigateway
+kill-instance.sh msb_discovery
+kill-instance.sh msb_consul
diff --git a/test/csit/plans/aai/esr-server/testplan.txt b/test/csit/plans/aai/esr-server/testplan.txt
new file mode 100644
index 000000000..43ed23e92
--- /dev/null
+++ b/test/csit/plans/aai/esr-server/testplan.txt
@@ -0,0 +1,4 @@
+# Test suites are relative paths under [integration.git]/test/csit/tests/.
+# Place the suites in run order.
+aai/esr-server/startup
+
diff --git a/test/csit/plans/aai/resources/docker-compose.yml b/test/csit/plans/aai/resources/docker-compose.yml
index ab7823630..09d2a8127 100644
--- a/test/csit/plans/aai/resources/docker-compose.yml
+++ b/test/csit/plans/aai/resources/docker-compose.yml
@@ -9,6 +9,7 @@ services:
- CHEF_BRANCH=master
- CHEF_GIT_URL=http://gerrit.onap.org/r/aai
- AAI_CORE_VERSION=1.1.0-SNAPSHOT
+ - LOCAL_USER_ID=${USER_ID}
ports:
- 8447:8447
logging:
@@ -25,6 +26,8 @@ services:
- CHEF_BRANCH=master
- CHEF_GIT_URL=http://gerrit.onap.org/r/aai
- AAI_CORE_VERSION=1.1.0-SNAPSHOT
+ - LOCAL_USER_ID=${USER_ID}
+ - DISABLE_UPDATE_QUERY=true
ports:
- 8446:8446
logging:
@@ -48,7 +51,7 @@ services:
max-size: "30m"
max-file: "5"
aai.hbase.simpledemo.openecomp.org:
- image: ${HBASE_IMAGE}
+ image: ${HBASE_IMAGE}:${HBASE_VERSION}
hostname: aai.hbase.simpledemo.openecomp.org
ports:
- 2181:2181
diff --git a/test/csit/plans/aai/resources/setup.sh b/test/csit/plans/aai/resources/setup.sh
index 30b4b29b8..19beb6365 100644
--- a/test/csit/plans/aai/resources/setup.sh
+++ b/test/csit/plans/aai/resources/setup.sh
@@ -31,7 +31,7 @@ function wait_for_container() {
CONTAINER_NAME="$1";
START_TEXT="$2";
- TIMEOUT=240
+ TIMEOUT=360
# wait for the real startup
AMOUNT_STARTUP=$(docker logs ${CONTAINER_NAME} 2>&1 | grep "$START_TEXT" | wc -l)
@@ -54,8 +54,12 @@ DOCKER_COMPOSE_CMD="docker-compose";
export MTU=$(/sbin/ifconfig | grep MTU | sed 's/.*MTU://' | sed 's/ .*//' | sort -n | head -1);
export DOCKER_REGISTRY="nexus3.onap.org:10001";
export AAI_HAPROXY_IMAGE="${AAI_HAPROXY_IMAGE:-aaionap/haproxy}";
-export HBASE_IMAGE="${HBASE_IMAGE:-harisekhon/hbase}";
+export HBASE_IMAGE="${HBASE_IMAGE:-aaionap/hbase}";
+export HBASE_VERSION="${HBASE_VERSION:-1.2.0}";
+docker pull ${HBASE_IMAGE}:${HBASE_VERSION};
+
+docker pull ${HBASE_IMAGE}:${HBASE_VERSION};
docker pull ${DOCKER_REGISTRY}/openecomp/aai-resources:${DOCKER_IMAGE_VERSION};
docker tag ${DOCKER_REGISTRY}/openecomp/aai-resources:${DOCKER_IMAGE_VERSION} ${DOCKER_REGISTRY}/openecomp/aai-resources:latest;
@@ -71,25 +75,36 @@ wait_for_container ${HBASE_CONTAINER_NAME} ' Started SelectChannelConnector@0.0.
wait_for_container ${HBASE_CONTAINER_NAME} ' Started SelectChannelConnector@0.0.0.0:8080';
wait_for_container ${HBASE_CONTAINER_NAME} ' Started SelectChannelConnector@0.0.0.0:9095';
-# Start the resources microservice
-RESOURCES_CONTAINER_NAME=$(${DOCKER_COMPOSE_CMD} up -d aai-resources.api.simpledemo.openecomp.org 2>&1 | grep 'Creating' | grep -v 'volume' | grep -v 'network' | awk '{ print $2; }' | head -1);
-wait_for_container ${RESOURCES_CONTAINER_NAME} '0.0.0.0:8447';
-docker logs ${CONTAINER_NAME};
-
-# Start the traversal microservice
-GRAPH_CONTAINER_NAME=$(${DOCKER_COMPOSE_CMD} up -d aai-traversal.api.simpledemo.openecomp.org 2>&1 | grep 'Creating' | awk '{ print $2; }' | head -1);
-wait_for_container ${GRAPH_CONTAINER_NAME} '0.0.0.0:8446';
+USER_EXISTS=$(check_if_user_exists aaiadmin);
-# Start the haproxy to route requests between resources and traversal
-HAPROXY_CONTAINER_NAME=$(${DOCKER_COMPOSE_CMD} up -d aai.api.simpledemo.openecomp.org 2>&1 |grep 'Creating' | grep -v 'volume' | grep -v 'network' | awk '{ print $2; }' | head -1);
+function check_if_user_exists(){
+ local user_id=$1;
-echo "A&AI Microservices, resources and traversal, are up and running along with HAProxy";
+ if [ -z "$user_id" ]; then
+ echo "Needs to provide at least one argument for check_if_user_exists func";
+ exit 1;
+ fi;
-docker exec $GRAPH_CONTAINER_NAME "/opt/app/aai-traversal/scripts/install/updateQueryData.sh" && {
- echo "Successfully loaded the widget related data into db";
-} || {
- echo "Unable to load widget related data into db";
+ id -u ${user_id} > /dev/null 2>&1 && {
+ echo "1";
+ } || {
+ echo "0";
+ }
}
+
+if [ "${USER_EXISTS}" -eq 0 ]; then
+ export USER_ID=9000;
+else
+ export USER_ID=$(id -u aaiadmin);
+fi;
+
+RESOURCES_CONTAINER_NAME=$(${DOCKER_COMPOSE_CMD} up -d aai-resources.api.simpledemo.openecomp.org 2>&1 | grep 'Creating' | grep -v 'volume' | grep -v 'network' | awk '{ print $2; }' | head -1);
+wait_for_container ${RESOURCES_CONTAINER_NAME} '0.0.0.0:8447';
+
+docker logs ${RESOURCES_CONTAINER_NAME};
+
+${DOCKER_COMPOSE_CMD} up -d aai-traversal.api.simpledemo.openecomp.org aai.api.simpledemo.openecomp.org
+echo "A&AI Microservices, resources and traversal, are up and running along with HAProxy";
# Set the host ip for robot from the haproxy
ROBOT_VARIABLES="-v HOST_IP:`ip addr show docker0 | head -3 | tail -1 | cut -d' ' -f6 | cut -d'/' -f1`"
diff --git a/test/csit/plans/aai/traversal/docker-compose.yml b/test/csit/plans/aai/traversal/docker-compose.yml
new file mode 100644
index 000000000..01dd4b481
--- /dev/null
+++ b/test/csit/plans/aai/traversal/docker-compose.yml
@@ -0,0 +1,72 @@
+version: '2'
+services:
+ aai-resources.api.simpledemo.openecomp.org:
+ image: ${DOCKER_REGISTRY}/openecomp/aai-resources
+ hostname: aai-resources.api.simpledemo.openecomp.org
+ environment:
+ - AAI_CHEF_ENV=simpledemo
+ - AAI_CHEF_LOC=/var/chef/aai-data/environments
+ - CHEF_BRANCH=master
+ - CHEF_GIT_URL=http://gerrit.onap.org/r/aai
+ - AAI_CORE_VERSION=1.1.0-SNAPSHOT
+ - LOCAL_USER_ID=${USER_ID}
+ ports:
+ - 8447:8447
+ logging:
+ driver: "json-file"
+ options:
+ max-size: "30m"
+ max-file: "5"
+ aai-traversal.api.simpledemo.openecomp.org:
+ image: ${DOCKER_REGISTRY}/openecomp/aai-traversal
+ hostname: aai-traversal.api.simpledemo.openecomp.org
+ environment:
+ - AAI_CHEF_ENV=simpledemo
+ - AAI_CHEF_LOC=/var/chef/aai-data/environments
+ - CHEF_BRANCH=master
+ - CHEF_GIT_URL=http://gerrit.onap.org/r/aai
+ - AAI_CORE_VERSION=1.1.0-SNAPSHOT
+ - DISABLE_UPDATE_QUERY=true
+ ports:
+ - 8446:8446
+ logging:
+ driver: "json-file"
+ options:
+ max-size: "30m"
+ max-file: "5"
+ aai.api.simpledemo.openecomp.org:
+ image: ${AAI_HAPROXY_IMAGE}
+ hostname: aai.api.simpledemo.openecomp.org
+ ports:
+ - 8443:8443
+ links:
+ - aai-resources.api.simpledemo.openecomp.org
+ - aai-traversal.api.simpledemo.openecomp.org
+ volumes:
+ - /dev/log:/dev/log
+ logging:
+ driver: "json-file"
+ options:
+ max-size: "30m"
+ max-file: "5"
+ aai.hbase.simpledemo.openecomp.org:
+ image: ${HBASE_IMAGE}:${HBASE_VERSION}
+ hostname: aai.hbase.simpledemo.openecomp.org
+ ports:
+ - 2181:2181
+ - 8080:8080
+ - 8085:8085
+ - 9090:9090
+ - 16000:16000
+ - 16010:16010
+ - 16201:16201
+ logging:
+ driver: "json-file"
+ options:
+ max-size: "30m"
+ max-file: "5"
+networks:
+ default:
+ driver: bridge
+ driver_opts:
+ com.docker.network.driver.mtu: ${MTU}
diff --git a/test/csit/plans/aai/traversal/setup.sh b/test/csit/plans/aai/traversal/setup.sh
new file mode 100644
index 000000000..010b0352e
--- /dev/null
+++ b/test/csit/plans/aai/traversal/setup.sh
@@ -0,0 +1,110 @@
+#!/bin/bash
+#
+# Copyright © 2017 AT&T Intellectual Property.
+# All rights reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+# ECOMP is a trademark and service mark of AT&T Intellectual Property.
+
+source ${SCRIPTS}/common_functions.sh
+
+NEXUS_USERNAME=$(cat /opt/config/nexus_username.txt)
+NEXUS_PASSWD=$(cat /opt/config/nexus_password.txt)
+NEXUS_DOCKER_REPO=$(cat /opt/config/nexus_docker_repo.txt)
+DOCKER_IMAGE_VERSION=$(cat /opt/config/docker_version.txt)
+DOCKER_REGISTRY=${NEXUS_DOCKER_REPO}
+DOCKER_IMAGE_VERSION=1.1-STAGING-latest
+
+function wait_for_container() {
+
+ CONTAINER_NAME="$1";
+ START_TEXT="$2";
+
+ TIMEOUT=360
+
+ # wait for the real startup
+ AMOUNT_STARTUP=$(docker logs ${CONTAINER_NAME} 2>&1 | grep "$START_TEXT" | wc -l)
+ while [[ ${AMOUNT_STARTUP} -ne 1 ]];
+ do
+ echo "Waiting for '$CONTAINER_NAME' deployment to finish ..."
+ AMOUNT_STARTUP=$(docker logs ${CONTAINER_NAME} 2>&1 | grep "$START_TEXT" | wc -l)
+ if [ "$TIMEOUT" = "0" ];
+ then
+ docker logs ${CONTAINER_NAME};
+ echo "ERROR: $CONTAINER_NAME deployment failed."
+ exit 1
+ fi
+ let TIMEOUT-=1
+ sleep 1
+ done
+}
+
+DOCKER_COMPOSE_CMD="docker-compose";
+export MTU=$(/sbin/ifconfig | grep MTU | sed 's/.*MTU://' | sed 's/ .*//' | sort -n | head -1);
+export DOCKER_REGISTRY="nexus3.onap.org:10001";
+export AAI_HAPROXY_IMAGE="${AAI_HAPROXY_IMAGE:-aaionap/haproxy}";
+export HBASE_IMAGE="${HBASE_IMAGE:-aaionap/hbase}";
+export HBASE_VERSION="${HBASE_VERSION:-1.2.0}";
+
+docker pull ${HBASE_IMAGE}:${HBASE_VERSION};
+
+docker pull ${DOCKER_REGISTRY}/openecomp/aai-resources:${DOCKER_IMAGE_VERSION};
+docker tag ${DOCKER_REGISTRY}/openecomp/aai-resources:${DOCKER_IMAGE_VERSION} ${DOCKER_REGISTRY}/openecomp/aai-resources:latest;
+
+docker pull ${DOCKER_REGISTRY}/openecomp/aai-traversal:${DOCKER_IMAGE_VERSION};
+docker tag ${DOCKER_REGISTRY}/openecomp/aai-traversal:${DOCKER_IMAGE_VERSION} ${DOCKER_REGISTRY}/openecomp/aai-traversal:latest;
+
+${DOCKER_COMPOSE_CMD} stop
+${DOCKER_COMPOSE_CMD} rm -f -v
+
+# Start the hbase where the data will be stored
+HBASE_CONTAINER_NAME=$(${DOCKER_COMPOSE_CMD} up -d aai.hbase.simpledemo.openecomp.org 2>&1 | grep 'Creating' | grep -v 'volume' | grep -v 'network' | awk '{ print $2; }' | head -1);
+wait_for_container ${HBASE_CONTAINER_NAME} ' Started SelectChannelConnector@0.0.0.0:8085';
+wait_for_container ${HBASE_CONTAINER_NAME} ' Started SelectChannelConnector@0.0.0.0:8080';
+wait_for_container ${HBASE_CONTAINER_NAME} ' Started SelectChannelConnector@0.0.0.0:9095';
+
+USER_EXISTS=$(check_if_user_exists aaiadmin);
+
+function check_if_user_exists(){
+ local user_id=$1;
+
+ if [ -z "$user_id" ]; then
+ echo "Needs to provide at least one argument for check_if_user_exists func";
+ exit 1;
+ fi;
+
+ id -u ${user_id} > /dev/null 2>&1 && {
+ echo "1";
+ } || {
+ echo "0";
+ }
+}
+
+
+if [ "${USER_EXISTS}" -eq 0 ]; then
+ export USER_ID=9000;
+else
+ export USER_ID=$(id -u aaiadmin);
+fi;
+
+RESOURCES_CONTAINER_NAME=$(${DOCKER_COMPOSE_CMD} up -d aai-resources.api.simpledemo.openecomp.org 2>&1 | grep 'Creating' | grep -v 'volume' | grep -v 'network' | awk '{ print $2; }' | head -1);
+wait_for_container ${RESOURCES_CONTAINER_NAME} '0.0.0.0:8447';
+
+TRAVERSAL_CONTAINER_NAME=$(${DOCKER_COMPOSE_CMD} up -d aai-traversal.api.simpledemo.openecomp.org 2>&1 | grep 'Creating' | grep -v 'volume' | grep -v 'network' | awk '{ print $2; }' | head -1);
+wait_for_container ${TRAVERSAL_CONTAINER_NAME} '0.0.0.0:8446';
+
+${DOCKER_COMPOSE_CMD} up -d aai.api.simpledemo.openecomp.org
+echo "A&AI Microservices, resources and traversal, are up and running along with HAProxy";
+# Set the host ip for robot from the haproxy
+ROBOT_VARIABLES="-v HOST_IP:`ip addr show docker0 | head -3 | tail -1 | cut -d' ' -f6 | cut -d'/' -f1`"
diff --git a/test/csit/plans/aai/traversal/teardown.sh b/test/csit/plans/aai/traversal/teardown.sh
new file mode 100644
index 000000000..8dd6358d8
--- /dev/null
+++ b/test/csit/plans/aai/traversal/teardown.sh
@@ -0,0 +1,27 @@
+#!/bin/bash
+#
+# Copyright © 2017 AT&T Intellectual Property.
+# Copyright © 2017 Amdocs
+# All rights reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+# ECOMP is a trademark and service mark of AT&T Intellectual Property.
+
+DOCKER_COMPOSE_CMD="docker-compose";
+export MTU=$(/sbin/ifconfig | grep MTU | sed 's/.*MTU://' | sed 's/ .*//' | sort -n | head -1);
+export DOCKER_REGISTRY="nexus3.onap.org:10001";
+
+$DOCKER_COMPOSE_CMD stop
+$DOCKER_COMPOSE_CMD rm -f -v
+
diff --git a/test/csit/plans/aai/traversal/testplan.txt b/test/csit/plans/aai/traversal/testplan.txt
new file mode 100644
index 000000000..9b48bf9b5
--- /dev/null
+++ b/test/csit/plans/aai/traversal/testplan.txt
@@ -0,0 +1,3 @@
+# Test suites are relative paths under [integration.git]/test/csit/tests/.
+# Place the suites in run order.
+aai/traversal/suite1
diff --git a/test/csit/scripts/aai/esr-server/startup.sh b/test/csit/scripts/aai/esr-server/startup.sh
new file mode 100644
index 000000000..a4d335b79
--- /dev/null
+++ b/test/csit/scripts/aai/esr-server/startup.sh
@@ -0,0 +1,21 @@
+#!/bin/bash
+#
+# Copyright 2017 ZTE Corporation.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+# $1 nickname for esr server
+
+docker login -u docker -p docker nexus3.onap.org:10001
+
+run-instance.sh nexus3.onap.org:10001/onap/aai/esr-server:latest $1 "-e MSB_IP=$2 -e MSB_Port=$3 -p 9518:9518" \ No newline at end of file
diff --git a/test/csit/tests/aai/esr-server/startup/__init__.robot b/test/csit/tests/aai/esr-server/startup/__init__.robot
new file mode 100644
index 000000000..c1eddc936
--- /dev/null
+++ b/test/csit/tests/aai/esr-server/startup/__init__.robot
@@ -0,0 +1,2 @@
+*** Settings ***
+Documentation AAI ESR SERVER - Startup
diff --git a/test/csit/tests/aai/esr-server/startup/test1.robot b/test/csit/tests/aai/esr-server/startup/test1.robot
new file mode 100644
index 000000000..53afeed27
--- /dev/null
+++ b/test/csit/tests/aai/esr-server/startup/test1.robot
@@ -0,0 +1,15 @@
+*** Settings ***
+Library RequestsLibrary
+
+*** Test Cases ***
+Liveness Test
+ [Documentation] Check various endpoints for basic liveness check
+ Create Session esr-server http://${ESRSERVER_IP}:9518
+ CheckUrl esr-server /api/aai-esr-server/v1/test
+
+*** Keywords ***
+CheckUrl
+ [Arguments] ${session} ${path}
+ ${resp}= Get Request ${session} ${path}
+ Should Be Equal As Integers ${resp.status_code} 200
+
diff --git a/test/csit/tests/aai/resources/api_suite/ems.robot b/test/csit/tests/aai/resources/api_suite/ems.robot
new file mode 100644
index 000000000..0068be35d
--- /dev/null
+++ b/test/csit/tests/aai/resources/api_suite/ems.robot
@@ -0,0 +1,65 @@
+*** Settings ***
+Library OperatingSystem
+Library RequestsLibrary
+Library requests
+Library Collections
+
+*** Variables ***
+${TARGETURL} https://${HOST_IP}:8443/aai/v11/external-system/esr-ems-list/esr-ems/ems-test1
+${EMSDATA} { "ems-id": "ems-test1", "esr-system-info-list": { "esr-system-info": [{ "esr-system-info-id": "ems-esr-system-info1", "system-name": "fff", "type": "ftp", "vendor": "ZTE", "version": "v1.0", "user-name": "root", "password": "123456", "system-type": "EMS_PERFORMANCE", "ip-address": "10.74.15.28", "port": "6767", "passive": true, "remote-path": "/data/peroformance"},{ "esr-system-info-id": "ems-esr-system-info2", "system-name": "fff", "type": "ftp", "vendor": "ZTE", "version": "v1.0", "user-name": "root", "password": "123456", "system-type": "EMS_RESOUCE", "ip-address": "10.74.15.29", "port": "6666", "passive": true, "remote-path": "/opt/Gcp/data/"},{ "esr-system-info-id": "ems-esr-system-info3", "system-name": "fff", "vendor": "ZTE", "version": "v1.0", "user-name": "root", "password": "123456", "system-type": "EMS_ALARM", "ip-address": "10.74.15.30", "port": "2000"}]}}
+
+*** Test Cases ***
+
+Run AAI Put ems
+ [Documentation] Create an ems object
+ ${resp}= PutWithCert ${TARGETURL} ${EMSDATA}
+ log ${TARGETURL}
+ log ${resp.text}
+ Should Be Equal As Strings ${resp.status_code} 201
+
+Run AAI Get ems
+ [Documentation] Get the ems object just created
+ ${resp} GetWithCert ${TARGETURL}
+ log ${resp}
+ log ${resp.json()}
+ Should Be Equal As Strings ${resp.status_code} 200
+ ${resource_version}= Evaluate $resp.json().get('resource-version')
+ Set Global Variable ${resource_version}
+
+Run AAI Delete ems
+ [Documentation] Delete the ems just created
+ ${resp}= DeleteWithCert ${TARGETURL}?resource-version=${resource_version}
+ log ${resp.text}
+ Should Be Equal As Strings ${resp.status_code} 204
+
+*** Keywords ***
+PutWithCert
+ [Arguments] ${url} ${data}
+ ${headers}= Create Dictionary Accept=application/json Content-Type=application/json X-TransactionId=integration-aai X-FromAppId=integration-aai Authorization=Basic QUFJOkFBSQ==
+ ${certinfo}= Evaluate ('${CURDIR}/aai.crt', '${CURDIR}/aai.key')
+ ${resp}= Evaluate requests.put('${url}', data='${data}', headers=${headers}, cert=${certinfo}, verify=False) requests
+ [return] ${resp}
+
+PostWithCert
+ [Arguments] ${url} ${data}
+ ${auth}= Create List AAI AAI
+ ${headers}= Create Dictionary Accept=application/json Content-Type=application/json X-TransactionId=integration-aai X-FromAppId=integration-aai Authorization=Basic QUFJOkFBSQ==
+ ${certinfo}= Evaluate ('${CURDIR}/aai.crt', '${CURDIR}/aai.key')
+ ${resp}= Evaluate requests.post('${url}', data='${data}', headers=${headers}, cert=${certinfo}, verify=False) requests
+ [return] ${resp}
+
+GetWithCert
+ [Arguments] ${url}
+ ${headers}= Create Dictionary Accept=application/json Content-Type=application/json X-TransactionId=integration-aai X-FromAppId=integration-aai Authorization=Basic QUFJOkFBSQ==
+ ${certinfo}= Evaluate ('${CURDIR}/aai.crt', '${CURDIR}/aai.key')
+ ${resp}= Evaluate requests.get('${url}', headers=${headers}, cert=${certinfo}, verify=False) requests
+ [return] ${resp}
+
+DeleteWithCert
+ [Arguments] ${url}
+ ${auth}= Create List AAI AAI
+ ${headers}= Create Dictionary Accept=application/json Content-Type=application/json X-TransactionId=integration-aai X-FromAppId=integration-aai Authorization=Basic QUFJOkFBSQ==
+ ${certinfo}= Evaluate ('${CURDIR}/aai.crt', '${CURDIR}/aai.key')
+ ${resp}= Evaluate requests.delete('${url}', headers=${headers}, cert=${certinfo}, verify=False) requests
+ [return] ${resp}
+
diff --git a/test/csit/tests/aai/resources/api_suite/thirdparty_sdnc.robot b/test/csit/tests/aai/resources/api_suite/thirdparty_sdnc.robot
new file mode 100644
index 000000000..bc27cafa8
--- /dev/null
+++ b/test/csit/tests/aai/resources/api_suite/thirdparty_sdnc.robot
@@ -0,0 +1,65 @@
+*** Settings ***
+Library OperatingSystem
+Library RequestsLibrary
+Library requests
+Library Collections
+
+*** Variables ***
+${TARGETURL} https://${HOST_IP}:8443/aai/v11/external-system/esr-thirdparty-sdnc-list/esr-thirdparty-sdnc/thirdparty-sdnc-test1
+${SDNCDATA} {"thirdparty-sdnc-id": "thirdparty-sdnc-test1", "location": "edge", "product-name": "aaa", "esr-system-info-list": { "esr-system-info": [{ "esr-system-info-id": "thirdparty-sdnc-esr-system-info-id", "system-name": "sdnc1", "type": "WAN", "vendor": "ZTE", "version": "v1.0", "service-url": "http://10.74.66.12:80", "user-name": "admin", "password": "admin", "system-type": "thirdparty_SDNC", "protocol": "netconf"}]}}
+
+*** Test Cases ***
+
+Run AAI Put thirdparty-sdnc
+ [Documentation] Create an thirdparty-sdnc object
+ ${resp}= PutWithCert ${TARGETURL} ${SDNCDATA}
+ log ${TARGETURL}
+ log ${resp.text}
+ Should Be Equal As Strings ${resp.status_code} 201
+
+Run AAI Get thirdparty-sdnc
+ [Documentation] Get the thirdparty-sdnc object just created
+ ${resp} GetWithCert ${TARGETURL}
+ log ${resp}
+ log ${resp.json()}
+ Should Be Equal As Strings ${resp.status_code} 200
+ ${resource_version}= Evaluate $resp.json().get('resource-version')
+ Set Global Variable ${resource_version}
+
+Run AAI Delete thirdparty-sdnc
+ [Documentation] Delete the thirdparty-sdnc just created
+ ${resp}= DeleteWithCert ${TARGETURL}?resource-version=${resource_version}
+ log ${resp.text}
+ Should Be Equal As Strings ${resp.status_code} 204
+
+*** Keywords ***
+PutWithCert
+ [Arguments] ${url} ${data}
+ ${headers}= Create Dictionary Accept=application/json Content-Type=application/json X-TransactionId=integration-aai X-FromAppId=integration-aai Authorization=Basic QUFJOkFBSQ==
+ ${certinfo}= Evaluate ('${CURDIR}/aai.crt', '${CURDIR}/aai.key')
+ ${resp}= Evaluate requests.put('${url}', data='${data}', headers=${headers}, cert=${certinfo}, verify=False) requests
+ [return] ${resp}
+
+PostWithCert
+ [Arguments] ${url} ${data}
+ ${auth}= Create List AAI AAI
+ ${headers}= Create Dictionary Accept=application/json Content-Type=application/json X-TransactionId=integration-aai X-FromAppId=integration-aai Authorization=Basic QUFJOkFBSQ==
+ ${certinfo}= Evaluate ('${CURDIR}/aai.crt', '${CURDIR}/aai.key')
+ ${resp}= Evaluate requests.post('${url}', data='${data}', headers=${headers}, cert=${certinfo}, verify=False) requests
+ [return] ${resp}
+
+GetWithCert
+ [Arguments] ${url}
+ ${headers}= Create Dictionary Accept=application/json Content-Type=application/json X-TransactionId=integration-aai X-FromAppId=integration-aai Authorization=Basic QUFJOkFBSQ==
+ ${certinfo}= Evaluate ('${CURDIR}/aai.crt', '${CURDIR}/aai.key')
+ ${resp}= Evaluate requests.get('${url}', headers=${headers}, cert=${certinfo}, verify=False) requests
+ [return] ${resp}
+
+DeleteWithCert
+ [Arguments] ${url}
+ ${auth}= Create List AAI AAI
+ ${headers}= Create Dictionary Accept=application/json Content-Type=application/json X-TransactionId=integration-aai X-FromAppId=integration-aai Authorization=Basic QUFJOkFBSQ==
+ ${certinfo}= Evaluate ('${CURDIR}/aai.crt', '${CURDIR}/aai.key')
+ ${resp}= Evaluate requests.delete('${url}', headers=${headers}, cert=${certinfo}, verify=False) requests
+ [return] ${resp}
+
diff --git a/test/csit/tests/aai/resources/api_suite/vim.robot b/test/csit/tests/aai/resources/api_suite/vim.robot
new file mode 100644
index 000000000..9a7fc1f93
--- /dev/null
+++ b/test/csit/tests/aai/resources/api_suite/vim.robot
@@ -0,0 +1,65 @@
+*** Settings ***
+Library OperatingSystem
+Library RequestsLibrary
+Library requests
+Library Collections
+
+*** Variables ***
+${TARGETURL} https://${HOST_IP}:8443/aai/v11/cloud-infrastructure/cloud-regions/cloud-region/VIM-test1/RegionOne1
+${VIMDATA} {"cloud-owner": "VIM-test1", "cloud-region-id": "RegionOne1", "cloud-type": "openstack", "owner-defined-type": "owner-defined-type", "cloud-region-version": "v1.0", "cloud-zone": "cloud zone", "complex-name": "complex name", "cloud-extra-info": "{}", "esr-system-info-list": { "esr-system-info": [{"esr-system-info-id": "vim-esr-system-info-id", "service-url": "http://10.12.25.2:5000/v3", "user-name": "demo", "password": "onapdemo", "system-type": "VIM", "ssl-insecure": true, "cloud-domain": "Default"}]}}
+
+*** Test Cases ***
+
+Run AAI Put VIM
+ [Documentation] Create an VIM object
+ ${resp}= PutWithCert ${TARGETURL} ${VIMDATA}
+ log ${TARGETURL}
+ log ${resp.text}
+ Should Be Equal As Strings ${resp.status_code} 201
+
+Run AAI Get VIM
+ [Documentation] Get the VIM object just created
+ ${resp} GetWithCert ${TARGETURL}
+ log ${resp}
+ log ${resp.json()}
+ Should Be Equal As Strings ${resp.status_code} 200
+ ${resource_version}= Evaluate $resp.json().get('resource-version')
+ Set Global Variable ${resource_version}
+
+Run AAI Delete VIM
+ [Documentation] Delete the VIM just created
+ ${resp}= DeleteWithCert ${TARGETURL}?resource-version=${resource_version}
+ log ${resp.text}
+ Should Be Equal As Strings ${resp.status_code} 204
+
+*** Keywords ***
+PutWithCert
+ [Arguments] ${url} ${data}
+ ${headers}= Create Dictionary Accept=application/json Content-Type=application/json X-TransactionId=integration-aai X-FromAppId=integration-aai Authorization=Basic QUFJOkFBSQ==
+ ${certinfo}= Evaluate ('${CURDIR}/aai.crt', '${CURDIR}/aai.key')
+ ${resp}= Evaluate requests.put('${url}', data='${data}', headers=${headers}, cert=${certinfo}, verify=False) requests
+ [return] ${resp}
+
+PostWithCert
+ [Arguments] ${url} ${data}
+ ${auth}= Create List AAI AAI
+ ${headers}= Create Dictionary Accept=application/json Content-Type=application/json X-TransactionId=integration-aai X-FromAppId=integration-aai Authorization=Basic QUFJOkFBSQ==
+ ${certinfo}= Evaluate ('${CURDIR}/aai.crt', '${CURDIR}/aai.key')
+ ${resp}= Evaluate requests.post('${url}', data='${data}', headers=${headers}, cert=${certinfo}, verify=False) requests
+ [return] ${resp}
+
+GetWithCert
+ [Arguments] ${url}
+ ${headers}= Create Dictionary Accept=application/json Content-Type=application/json X-TransactionId=integration-aai X-FromAppId=integration-aai Authorization=Basic QUFJOkFBSQ==
+ ${certinfo}= Evaluate ('${CURDIR}/aai.crt', '${CURDIR}/aai.key')
+ ${resp}= Evaluate requests.get('${url}', headers=${headers}, cert=${certinfo}, verify=False) requests
+ [return] ${resp}
+
+DeleteWithCert
+ [Arguments] ${url}
+ ${auth}= Create List AAI AAI
+ ${headers}= Create Dictionary Accept=application/json Content-Type=application/json X-TransactionId=integration-aai X-FromAppId=integration-aai Authorization=Basic QUFJOkFBSQ==
+ ${certinfo}= Evaluate ('${CURDIR}/aai.crt', '${CURDIR}/aai.key')
+ ${resp}= Evaluate requests.delete('${url}', headers=${headers}, cert=${certinfo}, verify=False) requests
+ [return] ${resp}
+
diff --git a/test/csit/tests/aai/resources/api_suite/vnfm.robot b/test/csit/tests/aai/resources/api_suite/vnfm.robot
new file mode 100644
index 000000000..13b0adf40
--- /dev/null
+++ b/test/csit/tests/aai/resources/api_suite/vnfm.robot
@@ -0,0 +1,65 @@
+*** Settings ***
+Library OperatingSystem
+Library RequestsLibrary
+Library requests
+Library Collections
+
+*** Variables ***
+${TARGETURL} https://${HOST_IP}:8443/aai/v11/external-system/esr-vnfm-list/esr-vnfm/vnfm-test1
+${VNFMDATA} {"vnfm-id": "vnfm-test1", "vim-id": "123", "certificate-url": "", "esr-system-info-list": {"esr-system-info": [{"esr-system-info-id":"esr-system-info-vnfm-test1", "system-name": "vnfmtest1", "type": "Tacker", "vendor": "ZTE", "version": "v1.0", "service-url": "http://10.74.44.12", "user-name": "admin", "password": "admin", "system-type": "VNFM"}]}}
+
+*** Test Cases ***
+
+Run AAI Put vnfm
+ [Documentation] Create an vnfm object
+ ${resp}= PutWithCert ${TARGETURL} ${VNFMDATA}
+ log ${TARGETURL}
+ log ${resp.text}
+ Should Be Equal As Strings ${resp.status_code} 201
+
+Run AAI Get vnfm
+ [Documentation] Get the vnfm object just created
+ ${resp} GetWithCert ${TARGETURL}
+ log ${resp}
+ log ${resp.json()}
+ Should Be Equal As Strings ${resp.status_code} 200
+ ${resource_version}= Evaluate $resp.json().get('resource-version')
+ Set Global Variable ${resource_version}
+
+Run AAI Delete vnfm
+ [Documentation] Delete the vnfm just created
+ ${resp}= DeleteWithCert ${TARGETURL}?resource-version=${resource_version}
+ log ${resp.text}
+ Should Be Equal As Strings ${resp.status_code} 204
+
+*** Keywords ***
+PutWithCert
+ [Arguments] ${url} ${data}
+ ${headers}= Create Dictionary Accept=application/json Content-Type=application/json X-TransactionId=integration-aai X-FromAppId=integration-aai Authorization=Basic QUFJOkFBSQ==
+ ${certinfo}= Evaluate ('${CURDIR}/aai.crt', '${CURDIR}/aai.key')
+ ${resp}= Evaluate requests.put('${url}', data='${data}', headers=${headers}, cert=${certinfo}, verify=False) requests
+ [return] ${resp}
+
+PostWithCert
+ [Arguments] ${url} ${data}
+ ${auth}= Create List AAI AAI
+ ${headers}= Create Dictionary Accept=application/json Content-Type=application/json X-TransactionId=integration-aai X-FromAppId=integration-aai Authorization=Basic QUFJOkFBSQ==
+ ${certinfo}= Evaluate ('${CURDIR}/aai.crt', '${CURDIR}/aai.key')
+ ${resp}= Evaluate requests.post('${url}', data='${data}', headers=${headers}, cert=${certinfo}, verify=False) requests
+ [return] ${resp}
+
+GetWithCert
+ [Arguments] ${url}
+ ${headers}= Create Dictionary Accept=application/json Content-Type=application/json X-TransactionId=integration-aai X-FromAppId=integration-aai Authorization=Basic QUFJOkFBSQ==
+ ${certinfo}= Evaluate ('${CURDIR}/aai.crt', '${CURDIR}/aai.key')
+ ${resp}= Evaluate requests.get('${url}', headers=${headers}, cert=${certinfo}, verify=False) requests
+ [return] ${resp}
+
+DeleteWithCert
+ [Arguments] ${url}
+ ${auth}= Create List AAI AAI
+ ${headers}= Create Dictionary Accept=application/json Content-Type=application/json X-TransactionId=integration-aai X-FromAppId=integration-aai Authorization=Basic QUFJOkFBSQ==
+ ${certinfo}= Evaluate ('${CURDIR}/aai.crt', '${CURDIR}/aai.key')
+ ${resp}= Evaluate requests.delete('${url}', headers=${headers}, cert=${certinfo}, verify=False) requests
+ [return] ${resp}
+
diff --git a/test/csit/tests/aai/resources/db_edge_rule/prevent_delete.robot b/test/csit/tests/aai/resources/db_edge_rule/prevent_delete.robot
new file mode 100644
index 000000000..beae2da51
--- /dev/null
+++ b/test/csit/tests/aai/resources/db_edge_rule/prevent_delete.robot
@@ -0,0 +1,131 @@
+*** Settings ***
+Library OperatingSystem
+Library RequestsLibrary
+Library requests
+Library Collections
+
+*** Variables ***
+${CRKEYVALUE7} cr-integration-test7
+${CRKEYVALUE8} cr-integration-test8
+${TENANTKEYVALUE} tenant-integration-test7
+${VSERVERKEYVALUE} vserver-integration-test7
+
+${CRURL} https://${HOST_IP}:8443/aai/v11/cloud-infrastructure/cloud-regions/cloud-region/${CRKEYVALUE7}/${CRKEYVALUE8}
+${TENANTURL} https://${HOST_IP}:8443/aai/v11/cloud-infrastructure/cloud-regions/cloud-region/${CRKEYVALUE7}/${CRKEYVALUE8}/tenants/tenant/${TENANTKEYVALUE}
+${VSERVERURL} https://${HOST_IP}:8443/aai/v11/cloud-infrastructure/cloud-regions/cloud-region/${CRKEYVALUE7}/${CRKEYVALUE8}/tenants/tenant/${TENANTKEYVALUE}/vservers/vserver/${VSERVERKEYVALUE}
+${CRDATA} {"cloud-owner":"${CRKEYVALUE7}","cloud-region-id":"${CRKEYVALUE8}","owner-defined-type":"example-owner-defined-type-98787654321-09","cloud-region-version":"example-cloud-region-version-98765784321-09","identity-url":"example-identity-url-98765437821-09","cloud-zone":"example-cloud-zone-98765784321-09","complex-name":"example-complex-name-98765874321-09"}
+${TENANTDATA} {"tenant-id":"${TENANTKEYVALUE}","tenant-name":"example-tenant-name-val-143742","vservers":{"vserver":[{"vserver-id":"${VSERVERKEYVALUE}","vserver-name":"example-vserver-name-val-357201","vserver-name2":"example-vserver-name2-val-672821","prov-status":"example-prov-status-val-137711","vserver-selflink":"example-vserver-selflink-val-58731","in-maint":true,"is-closed-loop-disabled":true}]}}
+
+
+*** Test Cases ***
+Run AAI Put cloud-region
+ [Documentation] Create an cloud-region object
+ ${resp}= PutWithCert ${CRURL} ${CRDATA}
+ log ${CRURL}
+ log ${resp.text}
+ Should Be Equal As Strings ${resp.status_code} 201
+
+Run AAI Put tenant
+ [Documentation] Create an tenant object
+ ${resp}= PutWithCert ${TENANTURL} ${TENANTDATA}
+ log ${TENANTURL}
+ log ${resp.text}
+ Should Be Equal As Strings ${resp.status_code} 201
+
+Run AAI Get tenant to delete
+ [Documentation] Get tenant object to delete
+ ${resp} GetWithCert ${TENANTURL}
+ log ${resp}
+ log ${resp.json()}
+ Should Be Equal As Strings ${resp.status_code} 200
+ ${resource_version}= Evaluate $resp.json().get('resource-version')
+ Set Global Variable ${resource_version}
+
+Run AAI Delete tenant
+ [Documentation] Delete the tenant
+ ${resp}= DeleteWithCert ${TENANTURL}?resource-version=${resource_version}
+ log ${resp.text}
+ Should Be Equal As Strings ${resp.status_code} 400
+
+Run AAI Get vserver to delete
+ [Documentation] Get vserver object to delete
+ ${resp} GetWithCert ${VSERVERURL}
+ log ${resp}
+ log ${resp.json()}
+ Should Be Equal As Strings ${resp.status_code} 200
+ ${resource_version}= Evaluate $resp.json().get('resource-version')
+ Set Global Variable ${resource_version}
+
+Run AAI Delete vserver
+ [Documentation] Delete the vserver
+ ${resp}= DeleteWithCert ${VSERVERURL}?resource-version=${resource_version}
+ log ${resp.text}
+ Should Be Equal As Strings ${resp.status_code} 204
+
+Run AAI Get tenant to delete
+ [Documentation] Get tenant object to delete
+ ${resp} GetWithCert ${TENANTURL}
+ log ${resp}
+ log ${resp.json()}
+ Should Be Equal As Strings ${resp.status_code} 200
+ ${resource_version}= Evaluate $resp.json().get('resource-version')
+ Set Global Variable ${resource_version}
+
+Run AAI Delete tenant
+ [Documentation] Delete the tenant
+ ${resp}= DeleteWithCert ${TENANTURL}?resource-version=${resource_version}
+ log ${resp.text}
+ Should Be Equal As Strings ${resp.status_code} 204
+
+Run AAI Get cr to delete
+ [Documentation] Get cr object to delete
+ ${resp} GetWithCert ${CRURL}
+ log ${resp}
+ log ${resp.json()}
+ Should Be Equal As Strings ${resp.status_code} 200
+ ${resource_version}= Evaluate $resp.json().get('resource-version')
+ Set Global Variable ${resource_version}
+
+Run AAI Delete cr
+ [Documentation] Delete the cr
+ ${resp}= DeleteWithCert ${CRURL}?resource-version=${resource_version}
+ log ${resp.text}
+ Should Be Equal As Strings ${resp.status_code} 204
+
+*** Keywords ***
+PutWithCert
+ [Arguments] ${url} ${data}
+ ${headers}= Create Dictionary Accept=application/json Content-Type=application/json X-TransactionId=integration-aai X-FromAppId=integration-aai Authorization=Basic QUFJOkFBSQ==
+ ${certinfo}= Evaluate ('${CURDIR}/aai.crt', '${CURDIR}/aai.key')
+ ${resp}= Evaluate requests.put('${url}', data='${data}', headers=${headers}, cert=${certinfo}, verify=False) requests
+ [return] ${resp}
+
+PatchWithCert
+ [Arguments] ${url} ${data}
+ ${headers}= Create Dictionary Accept=application/json Content-Type=application/merge-patch+json X-TransactionId=integration-aai X-FromAppId=integration-aai Authorization=Basic QUFJOkFBSQ==
+ ${certinfo}= Evaluate ('${CURDIR}/aai.crt', '${CURDIR}/aai.key')
+ ${resp}= Evaluate requests.patch('${url}', data='${data}', headers=${headers}, cert=${certinfo}, verify=False) requests
+ [return] ${resp}
+
+PostWithCert
+ [Arguments] ${url} ${data}
+ ${auth}= Create List AAI AAI
+ ${headers}= Create Dictionary Accept=application/json Content-Type=application/json X-TransactionId=integration-aai X-FromAppId=integration-aai Authorization=Basic QUFJOkFBSQ==
+ ${certinfo}= Evaluate ('${CURDIR}/aai.crt', '${CURDIR}/aai.key')
+ ${resp}= Evaluate requests.post('${url}', data='${data}', headers=${headers}, cert=${certinfo}, verify=False) requests
+ [return] ${resp}
+
+GetWithCert
+ [Arguments] ${url}
+ ${headers}= Create Dictionary Accept=application/json Content-Type=application/json X-TransactionId=integration-aai X-FromAppId=integration-aai Authorization=Basic QUFJOkFBSQ==
+ ${certinfo}= Evaluate ('${CURDIR}/aai.crt', '${CURDIR}/aai.key')
+ ${resp}= Evaluate requests.get('${url}', headers=${headers}, cert=${certinfo}, verify=False) requests
+ [return] ${resp}
+
+DeleteWithCert
+ [Arguments] ${url}
+ ${auth}= Create List AAI AAI
+ ${headers}= Create Dictionary Accept=application/json Content-Type=application/json X-TransactionId=integration-aai X-FromAppId=integration-aai Authorization=Basic QUFJOkFBSQ==
+ ${certinfo}= Evaluate ('${CURDIR}/aai.crt', '${CURDIR}/aai.key')
+ ${resp}= Evaluate requests.delete('${url}', headers=${headers}, cert=${certinfo}, verify=False) requests
+ [return] ${resp} \ No newline at end of file
diff --git a/test/csit/tests/aai/resources/relationship_suite/relationship_using_related_link.robot b/test/csit/tests/aai/resources/relationship_suite/relationship_using_related_link.robot
new file mode 100644
index 000000000..5820d4ac6
--- /dev/null
+++ b/test/csit/tests/aai/resources/relationship_suite/relationship_using_related_link.robot
@@ -0,0 +1,110 @@
+*** Settings ***
+Library OperatingSystem
+Library RequestsLibrary
+Library requests
+Library Collections
+
+*** Variables ***
+${COMPLEXKEYVALUE} complex-integration-test8
+${L3NETWORKKEYVALUE} l3-network-integration-test8
+${COMPLEXURL} https://${HOST_IP}:8443/aai/v11/cloud-infrastructure/complexes/complex/${COMPLEXKEYVALUE}
+${L3NETWORKURL} https://${HOST_IP}:8443/aai/v11/network/l3-networks/l3-network/${L3NETWORKKEYVALUE}
+${COMPLEXDATA} {"physical-location-id":"${COMPLEXKEYVALUE}","data-center-code":"example-data-center-code-val-77883","complex-name":"example-complex-name-val-12992","identity-url":"example-identity-url-val-74366","physical-location-type":"example-physical-location-type-val-32854","street1":"example-street1-val-26496","street2":"example-street2-val-6629","city":"example-city-val-30262","state":"example-state-val-9058","postal-code":"example-postal-code-val-44893","country":"example-country-val-98673","region":"example-region-val-10014","latitude":"example-latitude-val-47555","longitude":"example-longitude-val-76903","elevation":"example-elevation-val-63385","lata":"example-lata-val-90935"}
+${L3NETWORKDATA} {"network-id":"${L3NETWORKKEYVALUE}","network-name":"example-network-name-val-54688","network-type":"example-network-type-val-57468","network-role":"example-network-role-val-54868","network-technology":"example-network-technology-val-5468","neutron-network-id":"example-neutron-network-id-val-54678","is-bound-to-vpn":"true","service-id":"example-service-id-val-5468","orchestration-status":"example-orchestration-status-val-5468","heat-stack-id":"example-heat-stack-id-val-5468","mso-catalog-key":"example-mso-catalog-key-val-5468","relationship-list":{"relationship":[{"related-to":"complex","related-link":"/aai/v11/cloud-infrastructure/complexes/complex/${COMPLEXKEYVALUE}"}]}}
+
+*** Test Cases ***
+Run AAI Put complex
+ [Documentation] Create an complex object
+ ${resp}= PutWithCert ${COMPLEXURL} ${COMPLEXDATA}
+ log ${COMPLEXURL}
+ log ${resp.text}
+ Should Be Equal As Strings ${resp.status_code} 201
+
+Run AAI Get complex
+ [Documentation] Get the complex object just created
+ ${resp} GetWithCert ${COMPLEXURL}
+ log ${resp}
+ log ${resp.json()}
+ Should Be Equal As Strings ${resp.status_code} 200
+
+Run AAI Put l3-network relationship with complex
+ [Documentation] Create l3-network relationship with complex
+ ${resp}= PutWithCert ${L3NETWORKURL} ${L3NETWORKDATA}
+ log ${L3NETWORKURL}
+ log ${resp.text}
+ Should Be Equal As Strings ${resp.status_code} 201
+
+Run AAI Get l3-network
+ [Documentation] Get the l3-network object just created with relationship with complex
+ ${resp} GetWithCert ${L3NETWORKURL}
+ log ${resp}
+ log ${resp.json()}
+ Should Be Equal As Strings ${resp.status_code} 200
+
+Run AAI Get l3-network to delete
+ [Documentation] Get l3-network object to delete
+ ${resp} GetWithCert ${L3NETWORKURL}
+ log ${resp}
+ log ${resp.json()}
+ Should Be Equal As Strings ${resp.status_code} 200
+ ${resource_version}= Evaluate $resp.json().get('resource-version')
+ Set Global Variable ${resource_version}
+
+Run AAI Delete l3-network
+ [Documentation] Delete the l3-network just created
+ ${resp}= DeleteWithCert ${L3NETWORKURL}?resource-version=${resource_version}
+ log ${resp.text}
+ Should Be Equal As Strings ${resp.status_code} 204
+
+Run AAI Get complex to delete
+ [Documentation] Get complex object to delete
+ ${resp} GetWithCert ${COMPLEXURL}
+ log ${resp}
+ log ${resp.json()}
+ Should Be Equal As Strings ${resp.status_code} 200
+ ${resource_version}= Evaluate $resp.json().get('resource-version')
+ Set Global Variable ${resource_version}
+
+Run AAI Delete complex
+ [Documentation] Delete the complex just created
+ ${resp}= DeleteWithCert ${COMPLEXURL}?resource-version=${resource_version}
+ log ${resp.text}
+ Should Be Equal As Strings ${resp.status_code} 204
+
+*** Keywords ***
+PutWithCert
+ [Arguments] ${url} ${data}
+ ${headers}= Create Dictionary Accept=application/json Content-Type=application/json X-TransactionId=integration-aai X-FromAppId=integration-aai Authorization=Basic QUFJOkFBSQ==
+ ${certinfo}= Evaluate ('${CURDIR}/aai.crt', '${CURDIR}/aai.key')
+ ${resp}= Evaluate requests.put('${url}', data='${data}', headers=${headers}, cert=${certinfo}, verify=False) requests
+ [return] ${resp}
+
+PatchWithCert
+ [Arguments] ${url} ${data}
+ ${headers}= Create Dictionary Accept=application/json Content-Type=application/merge-patch+json X-TransactionId=integration-aai X-FromAppId=integration-aai Authorization=Basic QUFJOkFBSQ==
+ ${certinfo}= Evaluate ('${CURDIR}/aai.crt', '${CURDIR}/aai.key')
+ ${resp}= Evaluate requests.patch('${url}', data='${data}', headers=${headers}, cert=${certinfo}, verify=False) requests
+ [return] ${resp}
+
+PostWithCert
+ [Arguments] ${url} ${data}
+ ${auth}= Create List AAI AAI
+ ${headers}= Create Dictionary Accept=application/json Content-Type=application/json X-TransactionId=integration-aai X-FromAppId=integration-aai Authorization=Basic QUFJOkFBSQ==
+ ${certinfo}= Evaluate ('${CURDIR}/aai.crt', '${CURDIR}/aai.key')
+ ${resp}= Evaluate requests.post('${url}', data='${data}', headers=${headers}, cert=${certinfo}, verify=False) requests
+ [return] ${resp}
+
+GetWithCert
+ [Arguments] ${url}
+ ${headers}= Create Dictionary Accept=application/json Content-Type=application/json X-TransactionId=integration-aai X-FromAppId=integration-aai Authorization=Basic QUFJOkFBSQ==
+ ${certinfo}= Evaluate ('${CURDIR}/aai.crt', '${CURDIR}/aai.key')
+ ${resp}= Evaluate requests.get('${url}', headers=${headers}, cert=${certinfo}, verify=False) requests
+ [return] ${resp}
+
+DeleteWithCert
+ [Arguments] ${url}
+ ${auth}= Create List AAI AAI
+ ${headers}= Create Dictionary Accept=application/json Content-Type=application/json X-TransactionId=integration-aai X-FromAppId=integration-aai Authorization=Basic QUFJOkFBSQ==
+ ${certinfo}= Evaluate ('${CURDIR}/aai.crt', '${CURDIR}/aai.key')
+ ${resp}= Evaluate requests.delete('${url}', headers=${headers}, cert=${certinfo}, verify=False) requests
+ [return] ${resp} \ No newline at end of file
diff --git a/test/csit/tests/aai/traversal/suite1/__init__.robot b/test/csit/tests/aai/traversal/suite1/__init__.robot
new file mode 100644
index 000000000..8a1ac102d
--- /dev/null
+++ b/test/csit/tests/aai/traversal/suite1/__init__.robot
@@ -0,0 +1,2 @@
+*** Settings ***
+Documentation Traversal - Suite1
diff --git a/test/csit/tests/aai/traversal/suite1/aai.crt b/test/csit/tests/aai/traversal/suite1/aai.crt
new file mode 100644
index 000000000..6a28bbb8c
--- /dev/null
+++ b/test/csit/tests/aai/traversal/suite1/aai.crt
@@ -0,0 +1,70 @@
+Bag Attributes
+ friendlyName: aaiopenecomp
+ localKeyID: 54 69 6D 65 20 31 35 30 34 38 33 32 34 34 33 32 39 32
+subject=/C=US/ST=NJ/L=Bedminster/O=OpenECOMP/OU=SimpleDemo/CN=aai.api.simpledemo.openecomp.org/emailAddress=aai-host@api.simpledemo.openecomp.org
+issuer=/C=US/ST=NJ/L=Bedminster/O=OpenECOMP/OU=simpledemo/CN=OpenECOMP simpledemo Server CA X1/emailAddress=simpledemo@openecomp.org
+-----BEGIN CERTIFICATE-----
+MIIEiTCCA3GgAwIBAgIJAIPKfDLcn3MpMA0GCSqGSIb3DQEBCwUAMIGtMQswCQYD
+VQQGEwJVUzELMAkGA1UECAwCTkoxEzARBgNVBAcMCkJlZG1pbnN0ZXIxEjAQBgNV
+BAoMCU9wZW5FQ09NUDETMBEGA1UECwwKc2ltcGxlZGVtbzEqMCgGA1UEAwwhT3Bl
+bkVDT01QIHNpbXBsZWRlbW8gU2VydmVyIENBIFgxMScwJQYJKoZIhvcNAQkBFhhz
+aW1wbGVkZW1vQG9wZW5lY29tcC5vcmcwHhcNMTYxMTMwMTUzODM5WhcNMTcxMTMw
+MTUzODM5WjCBuTELMAkGA1UEBhMCVVMxCzAJBgNVBAgMAk5KMRMwEQYDVQQHDApC
+ZWRtaW5zdGVyMRIwEAYDVQQKDAlPcGVuRUNPTVAxEzARBgNVBAsMClNpbXBsZURl
+bW8xKTAnBgNVBAMMIGFhaS5hcGkuc2ltcGxlZGVtby5vcGVuZWNvbXAub3JnMTQw
+MgYJKoZIhvcNAQkBFiVhYWktaG9zdEBhcGkuc2ltcGxlZGVtby5vcGVuZWNvbXAu
+b3JnMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAwQrQl8A0rT0Jjlos
+Mr/7LEhT5UOif4GGPOk+3NCIxT3lOqAbUf+d9ZXyT2jWFRiKWua03vQ+Dxc8c2h2
+RRuH8LwEiOiWqPjWRxNqsARzZMI3ryHFCFBZh0FcpjH9kEeKVlLDYuV68k+ZucKd
+NiqUNn61lD7kbmEGwvzKwf91FrJ09+CBMx1OnWKm3gCNKDqAEFMZCOdn2MgesJYB
+/03lzPBS1jDfBXImXRcTBzpgA+wdCLn0cIQ1eLWUwS5tUqUJNh36nHdVyJ0P2Yjd
+JLuxhFcmBKOz1ShyyO+BBtKBO8EGbU6qKflOiwOw0Fsn8LjKcrHQ58NPui5y04BU
+Rypf3QIDAQABo4GdMIGaMAwGA1UdEwEB/wQCMAAwDgYDVR0PAQH/BAQDAgO4MB0G
+A1UdDgQWBBQyMUOsE2J+CKzK0qd8KFBD2gaWyjBbBgNVHSAEVDBSMFAGBFUdIAAw
+SDBGBggrBgEFBQcCAjA6GjhLZWVwIGF3YXkgZnJvbSBjaGlsZHJlbi4gIFRoaXMg
+Y2VydGlmaWNhdGUgaXMgbm90IGEgdG95LjANBgkqhkiG9w0BAQsFAAOCAQEAnkoy
+2tWJOyyyIQwtVojUxv1GWQPnw3WCUcKpuX4CJhHXLxNErW1fBg7bmo08BNmBPPpq
+WrJsy5lbBgUo9kgpViux5Stfy1rRIRsRLfl/icgCvJmUAxkmRCZL7yUvwG4K7s+8
+DwT+nW/XuWNP6Hd/qHccexB6COJ8KwvTdVoxAkCdX8qw4MCb/f7Kb1yle/vwBM5Q
+UUONCJ4bEns1vnb9DGlNDUJNwCfwORAaVJpVS38Mv4UnSTmb2KMePtCWcx/dNsYR
+2XrSGqLDnTvHwOpyhbfFTmackysGoSuDytORXy8YbwEiF13BwEK8i3rgNN0Z2ojf
+cpmE2xxmaa+A2uuN6g==
+-----END CERTIFICATE-----
+Bag Attributes
+ friendlyName: root
+ 2.16.840.1.113894.746875.1.1: <Unsupported tag 6>
+subject=/C=US/ST=NJ/L=Bedminster/O=OpenECOMP/OU=simpledemo/CN=OpenECOMP simpledemo Server CA X1/emailAddress=simpledemo@openecomp.org
+issuer=/C=US/ST=NJ/L=Bedminster/O=OpenECOMP/OU=simpledemo/CN=OpenECOMP simpledemo Root Certification Authority/emailAddress=simpledemo@openecomp.org
+-----BEGIN CERTIFICATE-----
+MIIFpTCCA42gAwIBAgIJAJqx8dKnCZZoMA0GCSqGSIb3DQEBCwUAMIG9MQswCQYD
+VQQGEwJVUzELMAkGA1UECAwCTkoxEzARBgNVBAcMCkJlZG1pbnN0ZXIxEjAQBgNV
+BAoMCU9wZW5FQ09NUDETMBEGA1UECwwKc2ltcGxlZGVtbzE6MDgGA1UEAwwxT3Bl
+bkVDT01QIHNpbXBsZWRlbW8gUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEn
+MCUGCSqGSIb3DQEJARYYc2ltcGxlZGVtb0BvcGVuZWNvbXAub3JnMB4XDTE2MTEy
+ODIxMTQyNloXDTIxMTEyNzIxMTQyNlowga0xCzAJBgNVBAYTAlVTMQswCQYDVQQI
+DAJOSjETMBEGA1UEBwwKQmVkbWluc3RlcjESMBAGA1UECgwJT3BlbkVDT01QMRMw
+EQYDVQQLDApzaW1wbGVkZW1vMSowKAYDVQQDDCFPcGVuRUNPTVAgc2ltcGxlZGVt
+byBTZXJ2ZXIgQ0EgWDExJzAlBgkqhkiG9w0BCQEWGHNpbXBsZWRlbW9Ab3BlbmVj
+b21wLm9yZzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALr4rivKQuRk
+YNf5Ig40e1nqj6s6LB1vgMOYbKfRziOFpPcUpsHPOhusHowiUsrU1vdFSzPz6Ej7
+PjlmNSg2Qka8YCn9kd6QgM7U0KcPJvIucBp+qjifH3EvP0jgDPhDeVRYxzV454dv
+5kQ9uCpswJP7YAnX51dkWeH8nwPUoagt31bOl9LXENSrgxEThxdLYMJnQJWk2CmV
+otXM4tT1dxyJxFUrZ6uJCEAYw5VtlplqihHf8lHy+sWQavtsLz/4dc+sGeXSTfoI
+voKvoh3uZ5gEhGV8yfJxk1veX5y5/AxP80vQ+smWYjTnQL5QQ57y4bciez4XVBmQ
+SWimWtOi4e8CAwEAAaOBtTCBsjAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQE
+AwIBhjAdBgNVHQ4EFgQUTqdsYgGNGubdJHq9tsaJhM9HE5wwcAYDVR0gBGkwZzBl
+BgRVHSAAMF0wWwYIKwYBBQUHAgIwTxpNSWYgeW91IHRydXN0IHRoaXMgY2VydCB0
+aGVuIHdlIGhhdmUgYSBicmlkZ2UgdGhhdCB5b3UgbWlnaHQgYmUgaW50ZXJlc3Rl
+ZCBpbi4wDQYJKoZIhvcNAQELBQADggIBAKNNlRqFuE/JgV1BHyYK0xoSXH4aZP/7
+IoHtDVcSaZAOOuFOUrwVMUbzRBebbb6RpFwt/X+NLFUGysd+XNLF7W7lzxKtmFNX
+n4OpNkBe0y5O7yurus8rERHzu3jiOSgVo+WzDlGpYSRnG3hI2qPWqD+Puzx/WwI8
+XUTuzEQQ3gUSyVFfXHpay3VpYmLZiLJ9WKY5SDw7Ie6Sxrju4Qm1HwnFY8wHZGcs
+2KMQzorJ1ZNQf523yUTghbT0rKaSFaD8zugPtI2ONfFG/QgrkQXo78opzPsHnHwa
+SxGSiAgeLbwAUCvPNl27zr6k6+7TcNjV0VUivAs0OG3VEAdgi7UWYB+30KfWwHwE
+zGmvd4IAGqIqlqLcSVArN5z8JK1B5nfjQn5UrclU1vK+dnuiKE2X4rKuBTRYRFR/
+km+mj4koYFPKFHndmJl1uv2OCJK9l5CSIuKWeI1qv8BASKqgNdoT/SKBXqxgYlCb
+o+j4IDjxrxChRO+e5vl9lA7INfRrbljCkUjfLRa+v2q9tWQ3+EQUwwnSrSfihh2T
+j0Tksr6b8dDsvMlCdOKG1B+JPcEXORSFKNXVTEfjqpJG8s16kFAocWt3S6xO0k1t
+qbQp+3tWQgW2TGnX0rMZzB6NGRNfWhlYmq2zHgXkiCIZ26Ztgt/LNbwEvN3+VlLo
+z/Rd+SKtlrfb
+-----END CERTIFICATE-----
diff --git a/test/csit/tests/aai/traversal/suite1/aai.key b/test/csit/tests/aai/traversal/suite1/aai.key
new file mode 100644
index 000000000..02724df46
--- /dev/null
+++ b/test/csit/tests/aai/traversal/suite1/aai.key
@@ -0,0 +1,32 @@
+Bag Attributes
+ friendlyName: aaiopenecomp
+ localKeyID: 54 69 6D 65 20 31 35 30 34 38 33 32 34 34 33 32 39 32
+Key Attributes: <No Attributes>
+-----BEGIN PRIVATE KEY-----
+MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQDBCtCXwDStPQmO
+Wiwyv/ssSFPlQ6J/gYY86T7c0IjFPeU6oBtR/531lfJPaNYVGIpa5rTe9D4PFzxz
+aHZFG4fwvASI6Jao+NZHE2qwBHNkwjevIcUIUFmHQVymMf2QR4pWUsNi5XryT5m5
+wp02KpQ2frWUPuRuYQbC/MrB/3UWsnT34IEzHU6dYqbeAI0oOoAQUxkI52fYyB6w
+lgH/TeXM8FLWMN8FciZdFxMHOmAD7B0IufRwhDV4tZTBLm1SpQk2Hfqcd1XInQ/Z
+iN0ku7GEVyYEo7PVKHLI74EG0oE7wQZtTqop+U6LA7DQWyfwuMpysdDnw0+6LnLT
+gFRHKl/dAgMBAAECggEBAJko2HkeIW01mUhdWOXnFgR7WjzzXZEmlffr41lVBr7f
+rejGsQZs9cms73R7rCdOsi8PDoA6bqaQfADg571K659fvYVWbHqh+3im+iWvUlKm
+GYIVG/vNrEq43CZsUU7Qw/xba/QiOFraNxCATTV1sORPwgddouXEi5XW9ZPX9/FJ
+wORx4L/K0DfHX1rr+rtOoHCJdZYhn3Ij87kmR8Mwg0fNeWhHqtxUEyM/itRjCvOe
+mgt2V8DORhmq12L4+5QJctBrkBVRp9Rh6YSZZBGnKbTSgf4q648BdkJDLSK4cguT
+D6BAw3gxj5V4wt5W0wn2JpjadFwnixrTzvMP/yAqfK0CgYEA93nBAoUPw8nzQkwk
+8iWBjfJ999Rw92hnnvk3xbcQcGfgUYuB4dxwe6FQTmFIVylt81er1YUvMb3ao7fo
+5ZcGnI5p1idjsd27kbZJLxb5Oh919hKu5IfkfYsVgnC0UdKCTgH5CaH0U4ATuXwt
+RL6qm0XcLALs5y2OO6z3s+mYhisCgYEAx7EQ8MA45bkXnRQiHBhGcIIcr2sRDfVJ
+OhHmGxx3EcYgtsIYKTqtQOyIt/nQxo6iyNL9bzfzBTybFJLuj63ZG1Ef4LosJedl
+eAU2NsKv5MlKYDSdNbLAJ0Op9I2Xu/pXQecPwY/3MkIQArdQCLevMLEGywCsuJTn
+BjkJNDkb9hcCgYAhoFiaiAwJVYKJSqFmibQd3opBR4uGApi54DE021gPff3b9rHS
+R8q88cFgtRVISqfW/d2qaKtt/dcckdvCfo/2a99zqux/+ZoIBZXSITQCMs4rfoRn
+JxPj/ycQD1JhH9J22QvGxEvXoLqNZJMeGS5DZO2yyT75dpYyA6Gwv5fq+wKBgQC5
+AhV917lfLELyZurLOLpaFlHZO8rLMcusH1UfHRo7v2IjsGOOHyzRD9QDD1IcA55R
+jRj8Z8uhuGq9fvvC5gBVTK3KGPI6E85wifOWfH1V7CAaTeSxEXDxb8EQL/a6U89v
+4VE5tdYCHC6VNZzS1staw0hV38QmJt57Z3Bdj+OV9QKBgE/b9fxpo+SVQ37BzNNY
+SEKTTijaddz8fdomApg6a2eFJL93Ej/op7N7gnHtPWMivPnRRza9ZjfnG+aZ7n2J
+sWyBiZK9xliS2TsF3l3q9Z0Vaq3i1nOlV7Bd20ZS8KjQjDtKnIRfLkQDkvmXbU5L
+emwkdsQZbpPFJch3mCGtI7JW
+-----END PRIVATE KEY-----
diff --git a/test/csit/tests/aai/traversal/suite1/custom_query_1.robot b/test/csit/tests/aai/traversal/suite1/custom_query_1.robot
new file mode 100644
index 000000000..4ced06f2e
--- /dev/null
+++ b/test/csit/tests/aai/traversal/suite1/custom_query_1.robot
@@ -0,0 +1,131 @@
+*** Settings ***
+Library OperatingSystem
+Library RequestsLibrary
+Library requests
+Library Collections
+
+*** Variables ***
+${GENERICVNFKEYVALUE} generic-vnf-integration-test1
+${PSERVERKEYVALUE} pserver-integration-test1
+${GENERICVNFURL} https://${HOST_IP}:8443/aai/v11/network/generic-vnfs/generic-vnf/${GENERICVNFKEYVALUE}
+${PSERVERURL} https://${HOST_IP}:8443/aai/v11/cloud-infrastructure/pservers/pserver/${PSERVERKEYVALUE}
+${RELATIONSHIPURL} https://${HOST_IP}:8443/aai/v11/network/generic-vnfs/generic-vnf/${GENERICVNFKEYVALUE}/relationship-list/relationship
+${CUSTOMQUERYURL} https://${HOST_IP}:8443/aai/v11/query?format=simple
+${GENERICVNFDATA} { "vnf-id": "${GENERICVNFKEYVALUE}", "vnf-name": "example-vnf-name-val-51663", "vnf-name2": "example-vnf-name2-val-15450", "vnf-type": "example-vnf-type-val-32726", "service-id": "example-service-id-val-49385", "regional-resource-zone": "example-regional-resource-zone-val-41257", "prov-status": "example-prov-status-val-5666", "operational-status": "example-operational-status-val-95008", "license-key": "example-license-key-val-25823", "equipment-role": "example-equipment-role-val-30138", "orchestration-status": "example-orchestration-status-val-18897", "heat-stack-id": "example-heat-stack-id-val-46807", "mso-catalog-key": "example-mso-catalog-key-val-43833", "management-option": "example-management-option-val-92040", "ipv4-oam-address": "example-ipv4-oam-address-val-85170", "ipv4-loopback0-address": "example-ipv4-loopback0-address-val-88650", "nm-lan-v6-address": "example-nm-lan-v6-address-val-76997", "management-v6-address": "example-management-v6-address-val-10065", "vcpu": 5182376, "vcpu-units": "example-vcpu-units-val-52149", "vmemory": 35401466, "vmemory-units": "example-vmemory-units-val-46534", "vdisk": 74255232, "vdisk-units": "example-vdisk-units-val-83649", "in-maint": true, "is-closed-loop-disabled": true, "summary-status": "example-summary-status-val-99435", "encrypted-access-flag": true, "entitlement-assignment-group-uuid": "example-entitlement-assignment-group-uuid-val-50758", "entitlement-resource-uuid": "example-entitlement-resource-uuid-val-21058", "license-assignment-group-uuid": "example-license-assignment-group-uuid-val-99092", "license-key-uuid": "example-license-key-uuid-val-93512", "nf-naming-code": "example-nf-naming-code-val-89", "selflink": "example-selflink-val-42557", "ipv4-oam-gateway-address": "example-ipv4-oam-gateway-address-val-50012", "ipv4-oam-gateway-address-prefix-length": 92759, "vlan-id-outer": 20604980, "nm-profile-name": "example-nm-profile-name-val-35055" }
+${PSERVERDATA} { "hostname": "${PSERVERKEYVALUE}", "ptnii-equip-name": "example-ptnii-equip-name-val-91724", "number-of-cpus": 56461, "disk-in-gigabytes": 13534, "ram-in-megabytes": 66589, "equip-type": "example-equip-type-val-94149", "equip-vendor": "example-equip-vendor-val-91811", "equip-model": "example-equip-model-val-26157", "fqdn": "example-fqdn-val-19743", "pserver-selflink": "example-pserver-selflink-val-67676", "ipv4-oam-address": "example-ipv4-oam-address-val-12819", "serial-number": "example-serial-number-val-33384", "ipaddress-v4-loopback-0": "example-ipaddress-v4-loopback0-val-63311", "ipaddress-v6-loopback-0": "example-ipaddress-v6-loopback0-val-70485", "ipaddress-v4-aim": "example-ipaddress-v4-aim-val-23497", "ipaddress-v6-aim": "example-ipaddress-v6-aim-val-24473", "ipaddress-v6-oam": "example-ipaddress-v6-oam-val-38196", "inv-status": "example-inv-status-val-10016", "pserver-id": "example-pserver-id-val-90123", "internet-topology": "example-internet-topology-val-17042", "in-maint": true, "pserver-name2": "example-pserver-name2-val-12304", "purpose": "example-purpose-val-86719", "prov-status": "example-prov-status-val-68126", "management-option": "example-management-option-val-86521", "host-profile": "example-host-profile-val-48679" }
+${CUSTOMQUERYDATA} {"gremlin":"g.V().has(\\'hostname\\', \\'${PSERVERKEYVALUE}\\')"}
+${PSERVER_GENERIC_VNF_RELATIONSHIPDATA} {"related-to":"pserver","relationship-data":[{"relationship-key":"pserver.hostname","relationship-value":"${PSERVERKEYVALUE}"}]}
+
+*** Test Cases ***
+
+Run AAI Put generic-vnf
+ [Documentation] Create an generic-vnf object
+ ${resp}= PutWithCert ${GENERICVNFURL} ${GENERICVNFDATA}
+ log ${GENERICVNFURL}
+ log ${resp.text}
+ Should Be Equal As Strings ${resp.status_code} 201
+
+Run AAI Put pserver
+ [Documentation] Create an pserver object
+ ${resp}= PutWithCert ${PSERVERURL} ${PSERVERDATA}
+ log ${PSERVERURL}
+ log ${resp.text}
+ Should Be Equal As Strings ${resp.status_code} 201
+
+Run AAI Put relationship of pserver and generic-vnf
+ [Documentation] Create relationship of pserver and generic-vnf
+ ${resp}= PutWithCert ${RELATIONSHIPURL} ${PSERVER_GENERIC_VNF_RELATIONSHIPDATA}
+ log ${RELATIONSHIPURL}
+ log ${resp.text}
+ Should Be Equal As Strings ${resp.status_code} 200
+
+Run AAI Get pserver
+ [Documentation] Get the pserver object just relationship
+ ${resp} GetWithCert ${PSERVERURL}
+ log ${resp}
+ log ${resp.json()}
+ Should Be Equal As Strings ${resp.status_code} 200
+
+Run AAI Get generic-vnf
+ [Documentation] Get the generic-vnf object just relationship
+ ${resp} GetWithCert ${GENERICVNFURL}
+ log ${resp}
+ log ${resp.json()}
+ Should Be Equal As Strings ${resp.status_code} 200
+
+Run AAI Put custom query simple format
+ [Documentation] custom query simple format
+ log ${CUSTOMQUERYDATA}
+ ${resp}= PutWithCert ${CUSTOMQUERYURL} ${CUSTOMQUERYDATA}
+ log ${CUSTOMQUERYURL}
+ log ${resp.text}
+ log ${resp.json()}
+ Should Be Equal As Strings ${resp.status_code} 200
+
+Run AAI Get generic-vnf to delete
+ [Documentation] Get the generic-vnf object to delete
+ ${resp} GetWithCert ${GENERICVNFURL}
+ log ${resp}
+ log ${resp.json()}
+ Should Be Equal As Strings ${resp.status_code} 200
+ ${resource_version}= Evaluate $resp.json().get('resource-version')
+ Set Global Variable ${resource_version}
+
+Run AAI Delete generic-vnf
+ [Documentation] Delete the generic-vnf
+ ${resp}= DeleteWithCert ${GENERICVNFURL}?resource-version=${resource_version}
+ log ${resp.text}
+ Should Be Equal As Strings ${resp.status_code} 204
+
+Run AAI Get pserver to delete
+ [Documentation] Get the pserver object to delete
+ ${resp} GetWithCert ${PSERVERURL}
+ log ${resp}
+ log ${resp.json()}
+ Should Be Equal As Strings ${resp.status_code} 200
+ ${resource_version}= Evaluate $resp.json().get('resource-version')
+ Set Global Variable ${resource_version}
+
+Run AAI Delete pserver
+ [Documentation] Delete the pserver
+ ${resp}= DeleteWithCert ${PSERVERURL}?resource-version=${resource_version}
+ log ${resp.text}
+ Should Be Equal As Strings ${resp.status_code} 204
+
+*** Keywords ***
+PutWithCert
+ [Arguments] ${url} ${data}
+ ${headers}= Create Dictionary Accept=application/json Content-Type=application/json X-TransactionId=integration-aai X-FromAppId=integration-aai Authorization=Basic QUFJOkFBSQ==
+ ${certinfo}= Evaluate ('${CURDIR}/aai.crt', '${CURDIR}/aai.key')
+ ${resp}= Evaluate requests.put('${url}', data='${data}', headers=${headers}, cert=${certinfo}, verify=False) requests
+ [return] ${resp}
+
+PatchWithCert
+ [Arguments] ${url} ${data}
+ ${headers}= Create Dictionary Accept=application/json Content-Type=application/merge-patch+json X-TransactionId=integration-aai X-FromAppId=integration-aai Authorization=Basic QUFJOkFBSQ==
+ ${certinfo}= Evaluate ('${CURDIR}/aai.crt', '${CURDIR}/aai.key')
+ ${resp}= Evaluate requests.patch('${url}', data='${data}', headers=${headers}, cert=${certinfo}, verify=False) requests
+ [return] ${resp}
+
+PostWithCert
+ [Arguments] ${url} ${data}
+ ${auth}= Create List AAI AAI
+ ${headers}= Create Dictionary Accept=application/json Content-Type=application/json X-TransactionId=integration-aai X-FromAppId=integration-aai Authorization=Basic QUFJOkFBSQ==
+ ${certinfo}= Evaluate ('${CURDIR}/aai.crt', '${CURDIR}/aai.key')
+ ${resp}= Evaluate requests.post('${url}', data='${data}', headers=${headers}, cert=${certinfo}, verify=False) requests
+ [return] ${resp}
+
+GetWithCert
+ [Arguments] ${url}
+ ${headers}= Create Dictionary Accept=application/json Content-Type=application/json X-TransactionId=integration-aai X-FromAppId=integration-aai Authorization=Basic QUFJOkFBSQ==
+ ${certinfo}= Evaluate ('${CURDIR}/aai.crt', '${CURDIR}/aai.key')
+ ${resp}= Evaluate requests.get('${url}', headers=${headers}, cert=${certinfo}, verify=False) requests
+ [return] ${resp}
+
+DeleteWithCert
+ [Arguments] ${url}
+ ${auth}= Create List AAI AAI
+ ${headers}= Create Dictionary Accept=application/json Content-Type=application/json X-TransactionId=integration-aai X-FromAppId=integration-aai Authorization=Basic QUFJOkFBSQ==
+ ${certinfo}= Evaluate ('${CURDIR}/aai.crt', '${CURDIR}/aai.key')
+ ${resp}= Evaluate requests.delete('${url}', headers=${headers}, cert=${certinfo}, verify=False) requests
+ [return] ${resp}