summaryrefslogtreecommitdiffstats
path: root/kubernetes/config/docker/init/src/config/robot
diff options
context:
space:
mode:
authorMandeep Khinda <Mandeep.Khinda@amdocs.com>2017-06-24 11:49:37 -0400
committerMandeep Khinda <Mandeep.Khinda@amdocs.com>2017-06-24 11:49:37 -0400
commitd6ea987caed84a9f36030a5a1516df7c6186362d (patch)
tree265dda9cfb43a78542e4b2ccac382a8a5583bc56 /kubernetes/config/docker/init/src/config/robot
parent43d96ac929c93d0aa2a55d860e0425a39118f7b4 (diff)
onap on kubernetes source files
Change-Id: I4de34baf90979651223a28323010deb7aef21946 Signed-off-by: Mandeep Khinda <Mandeep.Khinda@amdocs.com>
Diffstat (limited to 'kubernetes/config/docker/init/src/config/robot')
-rw-r--r--kubernetes/config/docker/init/src/config/robot/authorization1
-rwxr-xr-xkubernetes/config/docker/init/src/config/robot/demo-docker.sh123
-rwxr-xr-xkubernetes/config/docker/init/src/config/robot/demo-k8s.sh123
-rwxr-xr-xkubernetes/config/docker/init/src/config/robot/ete-docker.sh20
-rwxr-xr-xkubernetes/config/docker/init/src/config/robot/ete-k8s.sh23
-rwxr-xr-xkubernetes/config/docker/init/src/config/robot/eteshare/config/integration_preload_parameters.py134
-rwxr-xr-xkubernetes/config/docker/init/src/config/robot/eteshare/config/integration_robot_properties.py67
-rwxr-xr-xkubernetes/config/docker/init/src/config/robot/eteshare/config/vm_config2robot.sh19
-rwxr-xr-xkubernetes/config/docker/init/src/config/robot/eteshare/config/vm_properties.py17
-rw-r--r--kubernetes/config/docker/init/src/config/robot/robot/assets/asdc/.gitignore1
-rw-r--r--kubernetes/config/docker/init/src/config/robot/robot/assets/asdc/base_vfw/MANIFEST.json17
-rw-r--r--kubernetes/config/docker/init/src/config/robot/robot/assets/asdc/base_vfw/base_vfw.env4
-rw-r--r--kubernetes/config/docker/init/src/config/robot/robot/assets/asdc/base_vfw/base_vfw.yaml423
-rw-r--r--kubernetes/config/docker/init/src/config/robot/robot/assets/asdc/base_vlb/MANIFEST.json28
-rw-r--r--kubernetes/config/docker/init/src/config/robot/robot/assets/asdc/base_vlb/base_vlb.env4
-rw-r--r--kubernetes/config/docker/init/src/config/robot/robot/assets/asdc/base_vlb/base_vlb.yaml339
-rw-r--r--kubernetes/config/docker/init/src/config/robot/robot/assets/asdc/base_vlb/dnsscaling.env4
-rw-r--r--kubernetes/config/docker/init/src/config/robot/robot/assets/asdc/base_vlb/dnsscaling.yaml194
-rw-r--r--kubernetes/config/docker/init/src/config/robot/robot/assets/asdc/base_vvg/MANIFEST.json17
-rw-r--r--kubernetes/config/docker/init/src/config/robot/robot/assets/asdc/base_vvg/base_vvg.env3
-rw-r--r--kubernetes/config/docker/init/src/config/robot/robot/assets/asdc/base_vvg/base_vvg.yaml22
-rw-r--r--kubernetes/config/docker/init/src/config/robot/robot/assets/dcae/dcae_healthcheck.json5
-rw-r--r--kubernetes/config/docker/init/src/config/robot/robot/assets/keys/ecompdemo.pvt30
-rw-r--r--kubernetes/config/docker/init/src/config/robot/robot/assets/keys/robot_ssh_private_key.ppk26
-rw-r--r--kubernetes/config/docker/init/src/config/robot/robot/assets/keys/robot_ssh_private_key.pvt27
-rw-r--r--kubernetes/config/docker/init/src/config/robot/robot/assets/keys/robot_ssh_public_key.pub9
-rw-r--r--kubernetes/config/docker/init/src/config/robot/robot/assets/keys/robot_ssh_public_key.txt1
-rw-r--r--kubernetes/config/docker/init/src/config/robot/robot/assets/service_mappings.py29
-rw-r--r--kubernetes/config/docker/init/src/config/robot/robot/assets/templates/aai/add_customer.template25
-rw-r--r--kubernetes/config/docker/init/src/config/robot/robot/assets/templates/aai/add_demo_customer.template47
-rw-r--r--kubernetes/config/docker/init/src/config/robot/robot/assets/templates/aai/add_service_body.template6
-rw-r--r--kubernetes/config/docker/init/src/config/robot/robot/assets/templates/aai/add_tenant_body.template18
-rw-r--r--kubernetes/config/docker/init/src/config/robot/robot/assets/templates/aai/named_query.template17
-rw-r--r--kubernetes/config/docker/init/src/config/robot/robot/assets/templates/aai/service_subscription.template19
-rw-r--r--kubernetes/config/docker/init/src/config/robot/robot/assets/templates/aai/vlb_closed_loop_hack.template7
-rw-r--r--kubernetes/config/docker/init/src/config/robot/robot/assets/templates/appc/vnf_mount.template16
-rw-r--r--kubernetes/config/docker/init/src/config/robot/robot/assets/templates/asdc/action.template3
-rw-r--r--kubernetes/config/docker/init/src/config/robot/robot/assets/templates/asdc/catalog_resource.template43
-rw-r--r--kubernetes/config/docker/init/src/config/robot/robot/assets/templates/asdc/catalog_service.template34
-rw-r--r--kubernetes/config/docker/init/src/config/robot/robot/assets/templates/asdc/entitlement_pool.template26
-rw-r--r--kubernetes/config/docker/init/src/config/robot/robot/assets/templates/asdc/feature_group.template11
-rw-r--r--kubernetes/config/docker/init/src/config/robot/robot/assets/templates/asdc/key_group.template11
-rw-r--r--kubernetes/config/docker/init/src/config/robot/robot/assets/templates/asdc/license_agreement.template12
-rw-r--r--kubernetes/config/docker/init/src/config/robot/robot/assets/templates/asdc/license_model.template5
-rw-r--r--kubernetes/config/docker/init/src/config/robot/robot/assets/templates/asdc/resource_instance.template10
-rw-r--r--kubernetes/config/docker/init/src/config/robot/robot/assets/templates/asdc/software_product.template16
-rw-r--r--kubernetes/config/docker/init/src/config/robot/robot/assets/templates/asdc/user_remarks.template1
-rw-r--r--kubernetes/config/docker/init/src/config/robot/robot/assets/templates/cinder_add_volume.template9
-rw-r--r--kubernetes/config/docker/init/src/config/robot/robot/assets/templates/heat_add_stack.template12
-rw-r--r--kubernetes/config/docker/init/src/config/robot/robot/assets/templates/keystone_get_auth.template9
-rw-r--r--kubernetes/config/docker/init/src/config/robot/robot/assets/templates/neutron_add_network.template7
-rw-r--r--kubernetes/config/docker/init/src/config/robot/robot/assets/templates/neutron_add_subnet.template8
-rw-r--r--kubernetes/config/docker/init/src/config/robot/robot/assets/templates/nova_add_keypair.template6
-rw-r--r--kubernetes/config/docker/init/src/config/robot/robot/assets/templates/nova_add_server.template17
-rw-r--r--kubernetes/config/docker/init/src/config/robot/robot/assets/templates/policy/closedloop_configpolicy.template31
-rw-r--r--kubernetes/config/docker/init/src/config/robot/robot/assets/templates/policy/closedloop_createpolicy.template21
-rw-r--r--kubernetes/config/docker/init/src/config/robot/robot/assets/templates/policy/closedloop_deletepolicy.template5
-rw-r--r--kubernetes/config/docker/init/src/config/robot/robot/assets/templates/policy/closedloop_getconfigpolicy.template8
-rw-r--r--kubernetes/config/docker/init/src/config/robot/robot/assets/templates/policy/closedloop_opspolicy.template25
-rw-r--r--kubernetes/config/docker/init/src/config/robot/robot/assets/templates/policy/closedloop_pushpolicy.template5
-rw-r--r--kubernetes/config/docker/init/src/config/robot/robot/assets/templates/sdnc/dnsscaling_preload.template92
-rw-r--r--kubernetes/config/docker/init/src/config/robot/robot/assets/templates/sdnc/vfw_preload.template128
-rw-r--r--kubernetes/config/docker/init/src/config/robot/robot/assets/templates/sdnc/vlb_preload.template104
-rw-r--r--kubernetes/config/docker/init/src/config/robot/robot/assets/templates/sdnc/vvg_preload.template36
-rw-r--r--kubernetes/config/docker/init/src/config/robot/robot/assets/templates/template_example.template6
-rw-r--r--kubernetes/config/docker/init/src/config/robot/robot/assets/templates/vfw_pg_stream_enable.template4
-rw-r--r--kubernetes/config/docker/init/src/config/robot/robot/assets/templates/vfw_pg_streams_enable.template7
-rw-r--r--kubernetes/config/docker/init/src/config/robot/robot/assets/templates/web/index.html.template116
-rw-r--r--kubernetes/config/docker/init/src/config/robot/robot/resources/aaf_interface.robot29
-rw-r--r--kubernetes/config/docker/init/src/config/robot/robot/resources/aai/aai_interface.robot73
-rw-r--r--kubernetes/config/docker/init/src/config/robot/robot/resources/aai/create_customer.robot41
-rw-r--r--kubernetes/config/docker/init/src/config/robot/robot/resources/aai/create_service.robot75
-rw-r--r--kubernetes/config/docker/init/src/config/robot/robot/resources/aai/create_tenant.robot98
-rw-r--r--kubernetes/config/docker/init/src/config/robot/robot/resources/aai/network.robot42
-rw-r--r--kubernetes/config/docker/init/src/config/robot/robot/resources/aai/service_instance.robot110
-rw-r--r--kubernetes/config/docker/init/src/config/robot/robot/resources/aai/volume_group.robot31
-rw-r--r--kubernetes/config/docker/init/src/config/robot/robot/resources/appc_interface.robot54
-rw-r--r--kubernetes/config/docker/init/src/config/robot/robot/resources/asdc_interface.robot464
-rw-r--r--kubernetes/config/docker/init/src/config/robot/robot/resources/browser_setup.robot43
-rw-r--r--kubernetes/config/docker/init/src/config/robot/robot/resources/dcae_interface.robot57
-rw-r--r--kubernetes/config/docker/init/src/config/robot/robot/resources/demo_preload.robot202
-rw-r--r--kubernetes/config/docker/init/src/config/robot/robot/resources/global_properties.robot23
-rw-r--r--kubernetes/config/docker/init/src/config/robot/robot/resources/heatbridge.robot130
-rw-r--r--kubernetes/config/docker/init/src/config/robot/robot/resources/json_templater.robot21
-rw-r--r--kubernetes/config/docker/init/src/config/robot/robot/resources/mr_interface.robot28
-rw-r--r--kubernetes/config/docker/init/src/config/robot/robot/resources/mso_interface.robot54
-rw-r--r--kubernetes/config/docker/init/src/config/robot/robot/resources/openstack/cinder_interface.robot50
-rw-r--r--kubernetes/config/docker/init/src/config/robot/robot/resources/openstack/heat_interface.robot92
-rw-r--r--kubernetes/config/docker/init/src/config/robot/robot/resources/openstack/keystone_interface.robot55
-rw-r--r--kubernetes/config/docker/init/src/config/robot/robot/resources/openstack/neutron_interface.robot128
-rw-r--r--kubernetes/config/docker/init/src/config/robot/robot/resources/openstack/nova_interface.robot149
-rw-r--r--kubernetes/config/docker/init/src/config/robot/robot/resources/openstack/openstack_common.robot80
-rw-r--r--kubernetes/config/docker/init/src/config/robot/robot/resources/policy_interface.robot58
-rw-r--r--kubernetes/config/docker/init/src/config/robot/robot/resources/portal_interface.robot28
-rw-r--r--kubernetes/config/docker/init/src/config/robot/robot/resources/sdngc_interface.robot203
-rw-r--r--kubernetes/config/docker/init/src/config/robot/robot/resources/ssh/files.robot50
-rw-r--r--kubernetes/config/docker/init/src/config/robot/robot/resources/ssh/processes.robot74
-rw-r--r--kubernetes/config/docker/init/src/config/robot/robot/resources/stack_validation/darkstat_interface.robot82
-rw-r--r--kubernetes/config/docker/init/src/config/robot/robot/resources/stack_validation/packet_generator_interface.robot98
-rw-r--r--kubernetes/config/docker/init/src/config/robot/robot/resources/stack_validation/policy_check_vfw.robot96
-rw-r--r--kubernetes/config/docker/init/src/config/robot/robot/resources/stack_validation/validate_common.robot47
-rw-r--r--kubernetes/config/docker/init/src/config/robot/robot/resources/stack_validation/validate_dns_scaling.robot41
-rw-r--r--kubernetes/config/docker/init/src/config/robot/robot/resources/stack_validation/validate_vfw.robot77
-rw-r--r--kubernetes/config/docker/init/src/config/robot/robot/resources/stack_validation/validate_vlb.robot40
-rw-r--r--kubernetes/config/docker/init/src/config/robot/robot/resources/stack_validation/validate_vvg.robot16
-rw-r--r--kubernetes/config/docker/init/src/config/robot/robot/resources/test_templates/closedloop_test_template.robot202
-rw-r--r--kubernetes/config/docker/init/src/config/robot/robot/resources/test_templates/model_test_template.robot57
-rw-r--r--kubernetes/config/docker/init/src/config/robot/robot/resources/test_templates/vnf_orchestration_test_template.robot160
-rw-r--r--kubernetes/config/docker/init/src/config/robot/robot/resources/vid/create_service_instance.robot60
-rw-r--r--kubernetes/config/docker/init/src/config/robot/robot/resources/vid/create_vid_vnf.robot122
-rw-r--r--kubernetes/config/docker/init/src/config/robot/robot/resources/vid/teardown_vid.robot91
-rw-r--r--kubernetes/config/docker/init/src/config/robot/robot/resources/vid/vid_interface.robot101
-rw-r--r--kubernetes/config/docker/init/src/config/robot/robot/testsuites/closed-loop.robot15
-rw-r--r--kubernetes/config/docker/init/src/config/robot/robot/testsuites/demo.robot43
-rw-r--r--kubernetes/config/docker/init/src/config/robot/robot/testsuites/health-check.robot57
-rw-r--r--kubernetes/config/docker/init/src/config/robot/robot/testsuites/model-distribution.robot22
-rw-r--r--kubernetes/config/docker/init/src/config/robot/robot/testsuites/update_onap_page.robot92
-rw-r--r--kubernetes/config/docker/init/src/config/robot/robot/testsuites/vnf-orchestration.robot22
118 files changed, 6776 insertions, 0 deletions
diff --git a/kubernetes/config/docker/init/src/config/robot/authorization b/kubernetes/config/docker/init/src/config/robot/authorization
new file mode 100644
index 0000000000..988730f7a8
--- /dev/null
+++ b/kubernetes/config/docker/init/src/config/robot/authorization
@@ -0,0 +1 @@
+robot:robot
diff --git a/kubernetes/config/docker/init/src/config/robot/demo-docker.sh b/kubernetes/config/docker/init/src/config/robot/demo-docker.sh
new file mode 100755
index 0000000000..2d9c6e4e9d
--- /dev/null
+++ b/kubernetes/config/docker/init/src/config/robot/demo-docker.sh
@@ -0,0 +1,123 @@
+#!/bin/bash
+
+#
+# Execute tags built to support the hands on demo,
+#
+function usage
+{
+ echo "Usage: demo.sh <command> [<parameters>]"
+ echo " "
+ echo " demo.sh init"
+ echo " - Execute both init_customer + distribute"
+ echo " "
+ echo " demo.sh init_customer"
+ echo " - Create demo customer (Demonstration) and services, etc."
+ echo " "
+ echo " demo.sh distribute"
+ echo " - Distribute demo models (demoVFW and demoVLB)"
+ echo " "
+ echo " demo.sh preload <vnf_name> <module_name>"
+ echo " - Preload data for VNF for the <module_name>"
+ echo " "
+ echo " demo.sh appc <module_name>"
+ echo " - provide APPC with vFW module mount point for closed loop"
+ echo " "
+ echo " demo.sh init_robot"
+ echo " - Initialize robot after all ONAP VMs have started"
+ echo " "
+ echo " demo.sh instantiateVFW"
+ echo " - Instantiate vFW module for the a demo customer (DemoCust<uuid>)"
+ echo " "
+ echo " demo.sh deleteVNF <module_name from instantiateVFW>"
+ echo " - Delete the module created by instantiateVFW"
+}
+
+# Set the defaults
+if [ $# -eq 0 ];then
+ usage
+ exit
+fi
+##
+## if more than 1 tag is supplied, the must be provided with -i or -e
+##
+while [ $# -gt 0 ]
+do
+ key="$1"
+
+ case $key in
+ init_robot)
+ TAG="UpdateWebPage"
+ read -s -p "WEB Site Password for user 'test': " WEB_PASSWORD
+ if [ "$WEB_PASSWORD" = "" ]; then
+ echo ""
+ echo "WEB Password is required for user 'test'"
+ exit
+ fi
+ VARIABLES="$VARIABLES -v WEB_PASSWORD:$WEB_PASSWORD"
+ shift
+ ;;
+ init)
+ TAG="InitDemo"
+ shift
+ ;;
+ init_customer)
+ TAG="InitCustomer"
+ shift
+ ;;
+ distribute)
+ TAG="InitDistribution"
+ shift
+ ;;
+ preload)
+ TAG="PreloadDemo"
+ shift
+ if [ $# -ne 2 ];then
+ echo "Usage: demo.sh preload <vnf_name> <module_name>"
+ exit
+ fi
+ VARIABLES="$VARIABLES -v VNF_NAME:$1"
+ shift
+ VARIABLES="$VARIABLES -v MODULE_NAME:$1"
+ shift
+ ;;
+ appc)
+ TAG="APPCMountPointDemo"
+ shift
+ if [ $# -ne 1 ];then
+ echo "Usage: demo.sh appc <module_name>"
+ exit
+ fi
+ VARIABLES="$VARIABLES -v MODULE_NAME:$1"
+ shift
+ ;;
+ instantiateVFW)
+ TAG="instantiateVFW"
+ VARIABLES="$VARIABLES -v GLOBAL_BUILD_NUMBER:$$"
+ shift
+ ;;
+ deleteVNF)
+ TAG="deleteVNF"
+ shift
+ if [ $# -ne 1 ];then
+ echo "Usage: demo.sh deleteVNF <module_name from instantiateVFW>"
+ exit
+ fi
+ VARFILE=$1.py
+ if [ -e /opt/eteshare/${VARFILE} ]; then
+ VARIABLES="$VARIABLES -V /share/${VARFILE}"
+ else
+ echo "Cache file ${VARFILE} is not found"
+ exit
+ fi
+ shift
+ ;;
+ *)
+ usage
+ exit
+ esac
+done
+
+ETEHOME=/var/opt/OpenECOMP_ETE
+VARIABLEFILES="-V /share/config/vm_properties.py -V /share/config/integration_robot_properties.py -V /share/config/integration_preload_parameters.py"
+CONTAINER_ID=`docker ps |grep robot |grep onap-robot|grep -v gcr|awk '{print $1}'`
+docker exec ${CONTAINER_ID} ${ETEHOME}/runTags.sh ${VARIABLEFILES} ${VARIABLES} -d ${ETEHOME}/html/logs/demo/${TAG} -i ${TAG} --display 89 2> ${TAG}.out
diff --git a/kubernetes/config/docker/init/src/config/robot/demo-k8s.sh b/kubernetes/config/docker/init/src/config/robot/demo-k8s.sh
new file mode 100755
index 0000000000..8b56c8a39f
--- /dev/null
+++ b/kubernetes/config/docker/init/src/config/robot/demo-k8s.sh
@@ -0,0 +1,123 @@
+#!/bin/bash
+
+#
+# Execute tags built to support the hands on demo,
+#
+function usage
+{
+ echo "Usage: demo.sh <command> [<parameters>]"
+ echo " "
+ echo " demo.sh init"
+ echo " - Execute both init_customer + distribute"
+ echo " "
+ echo " demo.sh init_customer"
+ echo " - Create demo customer (Demonstration) and services, etc."
+ echo " "
+ echo " demo.sh distribute"
+ echo " - Distribute demo models (demoVFW and demoVLB)"
+ echo " "
+ echo " demo.sh preload <vnf_name> <module_name>"
+ echo " - Preload data for VNF for the <module_name>"
+ echo " "
+ echo " demo.sh appc <module_name>"
+ echo " - provide APPC with vFW module mount point for closed loop"
+ echo " "
+ echo " demo.sh init_robot"
+ echo " - Initialize robot after all ONAP VMs have started"
+ echo " "
+ echo " demo.sh instantiateVFW"
+ echo " - Instantiate vFW module for the a demo customer (DemoCust<uuid>)"
+ echo " "
+ echo " demo.sh deleteVNF <module_name from instantiateVFW>"
+ echo " - Delete the module created by instantiateVFW"
+}
+
+# Set the defaults
+if [ $# -eq 0 ];then
+ usage
+ exit
+fi
+##
+## if more than 1 tag is supplied, the must be provided with -i or -e
+##
+while [ $# -gt 0 ]
+do
+ key="$1"
+
+ case $key in
+ init_robot)
+ TAG="UpdateWebPage"
+ read -s -p "WEB Site Password for user 'test': " WEB_PASSWORD
+ if [ "$WEB_PASSWORD" = "" ]; then
+ echo ""
+ echo "WEB Password is required for user 'test'"
+ exit
+ fi
+ VARIABLES="$VARIABLES -v WEB_PASSWORD:$WEB_PASSWORD"
+ shift
+ ;;
+ init)
+ TAG="InitDemo"
+ shift
+ ;;
+ init_customer)
+ TAG="InitCustomer"
+ shift
+ ;;
+ distribute)
+ TAG="InitDistribution"
+ shift
+ ;;
+ preload)
+ TAG="PreloadDemo"
+ shift
+ if [ $# -ne 2 ];then
+ echo "Usage: demo.sh preload <vnf_name> <module_name>"
+ exit
+ fi
+ VARIABLES="$VARIABLES -v VNF_NAME:$1"
+ shift
+ VARIABLES="$VARIABLES -v MODULE_NAME:$1"
+ shift
+ ;;
+ appc)
+ TAG="APPCMountPointDemo"
+ shift
+ if [ $# -ne 1 ];then
+ echo "Usage: demo.sh appc <module_name>"
+ exit
+ fi
+ VARIABLES="$VARIABLES -v MODULE_NAME:$1"
+ shift
+ ;;
+ instantiateVFW)
+ TAG="instantiateVFW"
+ VARIABLES="$VARIABLES -v GLOBAL_BUILD_NUMBER:$$"
+ shift
+ ;;
+ deleteVNF)
+ TAG="deleteVNF"
+ shift
+ if [ $# -ne 1 ];then
+ echo "Usage: demo.sh deleteVNF <module_name from instantiateVFW>"
+ exit
+ fi
+ VARFILE=$1.py
+ if [ -e /opt/eteshare/${VARFILE} ]; then
+ VARIABLES="$VARIABLES -V /share/${VARFILE}"
+ else
+ echo "Cache file ${VARFILE} is not found"
+ exit
+ fi
+ shift
+ ;;
+ *)
+ usage
+ exit
+ esac
+done
+
+ETEHOME=/var/opt/OpenECOMP_ETE
+VARIABLEFILES="-V /share/config/vm_properties.py -V /share/config/integration_robot_properties.py -V /share/config/integration_preload_parameters.py"
+POD=$(kubectl --namespace onap-robot get pods | sed 's/ .*//'| grep robot)
+kubectl --namespace onap-robot exec ${POD} -- ${ETEHOME}/runTags.sh ${VARIABLEFILES} ${VARIABLES} -d ${ETEHOME}/html/logs/demo/${TAG} -i ${TAG} --display 89 2> ${TAG}.out
diff --git a/kubernetes/config/docker/init/src/config/robot/ete-docker.sh b/kubernetes/config/docker/init/src/config/robot/ete-docker.sh
new file mode 100755
index 0000000000..48b568dd9a
--- /dev/null
+++ b/kubernetes/config/docker/init/src/config/robot/ete-docker.sh
@@ -0,0 +1,20 @@
+#!/bin/bash
+
+#
+# Run the testsuite for the passed tag. Valid tags are ete, health, closedloop, instantiate
+# Please clean up logs when you are done...
+# Note: Do not run multiple concurrent ete.sh as the --display is not parameterized and tests will collide
+#
+if [ "$1" == "" ];then
+ echo "Usage: ete.sh [ health | ete | closedloop | instantiate ]"
+ exit
+fi
+
+export TAGS="-i $1"
+export ETEHOME=/var/opt/OpenECOMP_ETE
+export OUTPUT_FOLDER=ETE_$$
+
+VARIABLEFILES="-V /share/config/vm_properties.py -V /share/config/integration_robot_properties.py -V /share/config/integration_preload_parameters.py"
+VARIABLES="-v GLOBAL_BUILD_NUMBER:$$"
+CONTAINER_ID=`docker ps |grep robot |grep onap-robot|grep -v gcr|awk '{print $1}'`
+docker exec ${CONTAINER_ID} ${ETEHOME}/runTags.sh ${VARIABLEFILES} ${VARIABLES} -d ${ETEHOME}/html/logs/ete/${OUTPUT_FOLDER} ${TAGS} --display 88
diff --git a/kubernetes/config/docker/init/src/config/robot/ete-k8s.sh b/kubernetes/config/docker/init/src/config/robot/ete-k8s.sh
new file mode 100755
index 0000000000..2c0fd6c383
--- /dev/null
+++ b/kubernetes/config/docker/init/src/config/robot/ete-k8s.sh
@@ -0,0 +1,23 @@
+#!/bin/bash
+
+#
+# Run the testsuite for the passed tag. Valid tags are ete, health, closedloop, instantiate
+# Please clean up logs when you are done...
+# Note: Do not run multiple concurrent ete.sh as the --display is not parameterized and tests will collide
+#
+if [ "$1" == "" ];then
+ echo "Usage: ete.sh [ health | ete | closedloop | instantiate ]"
+ exit
+fi
+
+export TAGS="-i $1"
+export ETEHOME=/var/opt/OpenECOMP_ETE
+export OUTPUT_FOLDER=ETE_$$
+
+VARIABLEFILES="-V /share/config/vm_properties.py -V /share/config/integration_robot_properties.py -V /share/config/integration_preload_parameters.py"
+VARIABLES="-v GLOBAL_BUILD_NUMBER:$$"
+
+#docker exec openecompete_container ${ETEHOME}/runTags.sh ${VARIABLEFILES} ${VARIABLES} -d /share/logs/${OUTPUT_FOLDER} ${TAGS} --display 88
+
+POD=$(kubectl --namespace onap-robot get pods | sed 's/ .*//'| grep robot)
+kubectl --namespace onap-robot exec ${POD} -- ${ETEHOME}/runTags.sh ${VARIABLEFILES} ${VARIABLES} -d ${ETEHOME}/html/logs/ete/${OUTPUT_FOLDER} ${TAGS} --display 88
diff --git a/kubernetes/config/docker/init/src/config/robot/eteshare/config/integration_preload_parameters.py b/kubernetes/config/docker/init/src/config/robot/eteshare/config/integration_preload_parameters.py
new file mode 100755
index 0000000000..07edaa5c86
--- /dev/null
+++ b/kubernetes/config/docker/init/src/config/robot/eteshare/config/integration_preload_parameters.py
@@ -0,0 +1,134 @@
+GLOBAL_PRELOAD_PARAMETERS = {
+# heat template parameter values common to all heat template continaing these parameters
+ "defaults" : {
+ 'key_name' : 'vfw_key${uuid}',
+ "pub_key" : "ssh-rsa AAAAB3NzaC1yc2EAAAABJQAAAQEAqqnA9BAiMLtjOPSYBfhzLu4CiBolWoskDg4KVwhTJVTTeB6CqrQNcadlGXxOHhCYuNCKkUmIVF4WTOisVOJ75Z1c4OMoZLL85xVPKSIeH63kgVugwgPYQu55NbbWX+rsbUha3LnElDhNviMM3iTPbD5nnhKixNERAJMTLKXvZZZGqxW94bREknYPQTT2qrk3YRqwldncopp6Nkgv3AnSJz2gc9tjxnWF0poTQnQm/3D6hiJICrzKfAV0EaPN0KdtYjPhKrYoy6Qb/tKOVaaqsvwfKBJGrT9LfcA7D7M/yj292RT1XN63hI84WC383LsaPJ6eWdDTE6zUP1eGTWCoOw== rsa-key-20161026",
+ "repo_url_blob" : "https://nexus.onap.org/content/repositories/raw",
+ "repo_url_artifacts" : "https://nexus.onap.org/content/groups/staging",
+ "demo_artifacts_version" : "1.0.0",
+ "ecomp_private_net_id" : "OPENSTACK_NETWORK_ID_WITH_ONAP_ROUTE_HERE",
+ "ecomp_private_subnet_id" : "OPENSTACK_SUBNET_ID_WITH_ONAP_ROUTE_HERE",
+ "ecomp_private_net_cidr" : "NETWORK_CIDR_WITH_ONAP_ROUTE_HERE",
+
+ "dcae_collector_ip" : "192.168.176.225",
+ "dcae_collector_port" : "30241",
+
+ },
+# heat template parameter values for heat template instances created during Vnf-Orchestration test cases
+ "Vnf-Orchestration" : {
+ "vfw_preload.template": {
+ "unprotected_private_net_id" : "vofwl01_unprotected${hostid}",
+ "unprotected_private_net_cidr" : "192.168.10.0/24",
+ "protected_private_net_id" : "vofwl01_protected${hostid}",
+ "protected_private_net_cidr" : "192.168.20.0/24",
+ "vfw_private_ip_0" : "192.168.10.100",
+ "vfw_private_ip_1" : "192.168.20.100",
+ "vfw_private_ip_2" : "192.168.30.5",
+ "vpg_private_ip_0" : "192.168.10.200",
+ "vpg_private_ip_1" : "192.168.30.3",
+ "vsn_private_ip_0" : "192.168.20.250",
+ "vsn_private_ip_1" : "192.168.30.4",
+ 'vfw_name_0':'vofwl01fwl${hostid}',
+ 'vpg_name_0':'vofwl01pgn${hostid}',
+ 'vsn_name_0':'vofwl01snk${hostid}',
+ },
+ "vlb_preload.template" : {
+ "vlb_private_net_id" : "volb01_private${hostid}",
+ "vlb_private_net_cidr" : "192.168.30.0/24",
+ "vlb_private_ip_0" : "192.168.30.100",
+ "vlb_private_ip_1" : "192.168.30.4",
+ "vdns_private_ip_0" : "192.168.30.110",
+ "vdns_private_ip_1" : "192.168.30.5",
+ 'vlb_name_0':'vovlblb${hostid}',
+ 'vdns_name_0':'vovlbdns${hostid}',
+ },
+ "dnsscaling_preload.template" : {
+ "vlb_private_net_id" : "volb01_private${hostid}",
+ "vlb_private_ip_0" : "192.168.30.100",
+ "vlb_private_ip_1" : "192.168.30.4",
+ "vdns_private_ip_0" : "192.168.30.222",
+ "vdns_private_ip_1" : "192.168.30.6",
+ 'scaling_vdns_name_0':'vovlbscaling${hostid}',
+ },
+ "vvg_preload.template" : {
+ }
+ },
+# heat template parameter values for heat template instances created during Closed-Loop test cases
+ "Closed-Loop" : {
+ "vfw_preload.template": {
+ "unprotected_private_net_id" : "clfwl01_unprotected${hostid}",
+ "unprotected_private_net_cidr" : "192.168.110.0/24",
+ "protected_private_net_id" : "clfwl01_protected${hostid}",
+ "protected_private_net_cidr" : "192.168.120.0/24",
+ "vfw_private_ip_0" : "192.168.110.100",
+ "vfw_private_ip_1" : "192.168.120.100",
+ "vfw_private_ip_2" : "192.168.30.11",
+ "vpg_private_ip_0" : "192.168.110.200",
+ "vpg_private_ip_1" : "192.168.30.12",
+ "vsn_private_ip_0" : "192.168.120.250",
+ "vsn_private_ip_1" : "192.168.30.13",
+ 'vfw_name_0':'clfwl01fwl${hostid}',
+ 'vpg_name_0':'clfwl01pgn${hostid}',
+ 'vsn_name_0':'clfwl01snk${hostid}',
+ },
+ "vlb_preload.template" : {
+ "vlb_private_net_id" : "cllb01_private${hostid}",
+ "vlb_private_net_cidr" : "192.168.130.0/24",
+ "vlb_private_ip_0" : "192.168.130.100",
+ "vlb_private_ip_1" : "192.168.30.14",
+ "vdns_private_ip_0" : "192.168.130.110",
+ "vdns_private_ip_1" : "192.168.30.15",
+ 'vlb_name_0':'clvlblb${hostid}',
+ 'vdns_name_0':'clvlbdns${hostid}',
+ },
+ "dnsscaling_preload.template" : {
+ "vlb_private_net_id" : "cllb01_private${hostid}",
+ "vlb_private_ip_0" : "192.168.130.100",
+ "vlb_private_ip_1" : "192.168.30.14",
+ "vdns_private_ip_0" : "192.168.130.222",
+ "vdns_private_ip_1" : "192.168.30.16",
+ 'scaling_vdns_name_0':'clvlbscaling${hostid}',
+ },
+ "vvg_preload.template" : {
+ }
+ },
+ # heat template parameter values for heat template instances created for hands on demo test case
+ "Demo" : {
+ "vfw_preload.template": {
+ "unprotected_private_net_id" : "demofwl_unprotected",
+ "unprotected_private_net_cidr" : "192.168.110.0/24",
+ "protected_private_net_id" : "demofwl_protected",
+ "protected_private_net_cidr" : "192.168.120.0/24",
+ "vfw_private_ip_0" : "192.168.110.100",
+ "vfw_private_ip_1" : "192.168.120.100",
+ "vfw_private_ip_2" : "192.168.30.11",
+ "vpg_private_ip_0" : "192.168.110.200",
+ "vpg_private_ip_1" : "192.168.30.12",
+ "vsn_private_ip_0" : "192.168.120.250",
+ "vsn_private_ip_1" : "192.168.30.13",
+ 'vfw_name_0':'demofwl01fwl',
+ 'vpg_name_0':'demofwl01pgn',
+ 'vsn_name_0':'demofwl01snk',
+ },
+ "vlb_preload.template" : {
+ "vlb_private_net_id" : "demolb_private",
+ "vlb_private_net_cidr" : "192.168.130.0/24",
+ "vlb_private_ip_0" : "192.168.130.100",
+ "vlb_private_ip_1" : "192.168.30.14",
+ "vdns_private_ip_0" : "192.168.130.110",
+ "vdns_private_ip_1" : "192.168.30.15",
+ 'vlb_name_0':'demovlblb',
+ 'vdns_name_0':'demovlbdns',
+ },
+ "dnsscaling_preload.template" : {
+ "vlb_private_net_id" : "demolb_private",
+ "vlb_private_ip_0" : "192.168.130.100",
+ "vlb_private_ip_1" : "192.168.30.16",
+ "vdns_private_ip_0" : "192.168.130.222",
+ "vdns_private_ip_1" : "192.168.30.17",
+ 'scaling_vdns_name_0':'demovlbscaling',
+ },
+ "vvg_preload.template" : {
+ }
+ }
+}
diff --git a/kubernetes/config/docker/init/src/config/robot/eteshare/config/integration_robot_properties.py b/kubernetes/config/docker/init/src/config/robot/eteshare/config/integration_robot_properties.py
new file mode 100755
index 0000000000..6b5c336d44
--- /dev/null
+++ b/kubernetes/config/docker/init/src/config/robot/eteshare/config/integration_robot_properties.py
@@ -0,0 +1,67 @@
+# aaf info - everything is from the private oam network (also called ecomp private network)
+GLOBAL_AAF_SERVER = "http://10.0.12.1:8101"
+GLOBAL_AAF_USERNAME = "dgl@openecomp.org"
+GLOBAL_AAF_PASSWORD = "ecomp_admin"
+# aai info - everything is from the private oam network (also called ecomp private network)
+GLOBAL_AAI_SERVER_URL = "https://aai-service.onap-aai:8443"
+GLOBAL_AAI_USERNAME = "AAI"
+GLOBAL_AAI_PASSWORD = "AAI"
+# appc info - everything is from the private oam network (also called ecomp private network)
+GLOBAL_APPC_SERVER = "http://sdnhost.onap-appc:8282"
+GLOBAL_APPC_USERNAME = "admin"
+GLOBAL_APPC_PASSWORD = "Kp8bJ4SXszM0WXlhak3eHlcse2gAw84vaoGGmJvUy2U"
+# sdc info - everything is from the private oam network (also called ecomp private network)
+GLOBAL_ASDC_FE_SERVER = "http://sdc-fe.onap-sdc"
+GLOBAL_ASDC_BE_SERVER = "http://sdc-be.onap-sdc"
+GLOBAL_ASDC_FE_PORT = "8181"
+GLOBAL_ASDC_BE_PORT = "8080"
+GLOBAL_ASDC_BE_USERNAME = "beep"
+GLOBAL_ASDC_BE_PASSWORD = "boop"
+# dcae info - everything is from the private oam network (also called ecomp private network)
+GLOBAL_DCAE_SERVER = "http://dcae-controller.onap-dcae:9998"
+GLOBAL_DCAE_USERNAME = "console"
+GLOBAL_DCAE_PASSWORD = "ZjJkYjllMjljMTI2M2Iz"
+# message router info - everything is from the private oam network (also called ecomp private network)
+GLOBAL_MR_SERVER = "http://dmaap.onap-message-router:3904"
+# mso info - everything is from the private oam network (also called ecomp private network)
+GLOBAL_MSO_SERVER = "http://mso.onap-mso:8080"
+GLOBAL_MSO_USERNAME = "InfraPortalClient"
+GLOBAL_MSO_PASSWORD = "password1$"
+# openstack info - info to select right info in environment
+GLOBAL_OPENSTACK_KEYSTONE_SERVER = "http://OPENSTACK_KEYSTONE_IP_HERE:5000"
+# packet generate vnf info - everything is from the private oam network (also called ecomp private network)
+GLOBAL_PACKET_GENERATOR_PORT = "8183"
+GLOBAL_PACKET_GENERATOR_USERNAME = "admin"
+GLOBAL_PACKET_GENERATOR_PASSWORD = "admin"
+GLOBAL_PGN_PORT = "2831"
+# policy info - everything is from the private oam network (also called ecomp private network)
+GLOBAL_POLICY_SERVER_URL = "http://pypdp.onap-policy:8480"
+GLOBAL_POLICY_AUTH = "dGVzdHJlc3Q6M2MwbXBVI2gwMUBOMWMz"
+GLOBAL_POLICY_CLIENTAUTH = "cHl0aG9uOnRlc3Q="
+GLOBAL_POLICY_HEALTHCHECK_URL = "http://drools.onap-policy:6969"
+GLOBAL_POLICY_USERNAME = "healthcheck"
+GLOBAL_POLICY_PASSWORD = "zb!XztG34"
+# portal info - everything is from the private oam network (also called ecomp private network)
+GLOBAL_PORTAL_SERVER = "http://portalapps.onap-portal:8989"
+GLOBAL_PORTAL_USERNAME = "demo"
+GLOBAL_PORTAL_PASSWORD = "Kp8bJ4SXszM0WXlhak3eHlcse"
+# sdngc info - everything is from the private oam network (also called ecomp private network)
+GLOBAL_SDNGC_SERVER = "http://sdnhost.onap-sdnc"
+GLOBAL_SDNGC_PORTAL = "http://sdnc-portal.onap-sdnc"
+GLOBAL_SDNGC_REST_PORT = "8282"
+GLOBAL_SDNGC_ADMIN_PORT = "8843"
+GLOBAL_SDNGC_USERNAME = "admin"
+GLOBAL_SDNGC_PASSWORD = "Kp8bJ4SXszM0WXlhak3eHlcse2gAw84vaoGGmJvUy2U"
+# vid info - everything is from the private oam network (also called ecomp private network)
+GLOBAL_VID_USERNAME = "demo"
+GLOBAL_VID_PASSWORD = "Kp8bJ4SXszM0WX"
+GLOBAL_VID_HEALTH_USERNAME = "Default"
+GLOBAL_VID_HEALTH_PASSWORD = "AppPassword!1"
+GLOBAL_VID_SERVER = "http://vid-server.onap-vid:8080"
+#global selenium info
+GLOBAL_PROXY_WARNING_TITLE=""
+GLOBAL_PROXY_WARNING_CONTINUE_XPATH=""
+# settings for vm to attach vvg too
+GLOBAL_VVGSERVER_IMAGE = "UBUNTU_14_IMAGE_NAME_HERE"
+GLOBAL_VVGSERVER_FLAVOR = "OPENSTACK_FLAVOUR_NAME_HERE"
+# dns info
diff --git a/kubernetes/config/docker/init/src/config/robot/eteshare/config/vm_config2robot.sh b/kubernetes/config/docker/init/src/config/robot/eteshare/config/vm_config2robot.sh
new file mode 100755
index 0000000000..962eea86ec
--- /dev/null
+++ b/kubernetes/config/docker/init/src/config/robot/eteshare/config/vm_config2robot.sh
@@ -0,0 +1,19 @@
+#!/bin/bash
+
+#
+# Make vm1_robot config available to robot
+#
+CONFIG=/opt/config
+PROPERTIES=/opt/eteshare/config/vm_properties.py
+GLOBAL_VM_PROPERTIES="# File generated from /opt/config\n#\n"
+for f in `ls $CONFIG/*.txt`;
+do
+ VALUE=`cat $f`
+ NAME=${f%.*}
+ NAME=${NAME##*/}
+ GLOBAL_VM_PROPERTIES=$"$GLOBAL_VM_PROPERTIES \"$NAME\" : \"$VALUE\",\n"
+done
+GLOBAL_VM_PROPERTIES=${GLOBAL_VM_PROPERTIES/%,\\n/\}}
+echo -e $GLOBAL_VM_PROPERTIES > $PROPERTIES
+REGION=`cat $CONFIG/region.txt`
+echo -e "\nGLOBAL_OPENSTACK_SERVICE_REGION = \"$REGION\"" >> /opt/eteshare/config/integration_robot_properties.py
diff --git a/kubernetes/config/docker/init/src/config/robot/eteshare/config/vm_properties.py b/kubernetes/config/docker/init/src/config/robot/eteshare/config/vm_properties.py
new file mode 100755
index 0000000000..88f1020bcb
--- /dev/null
+++ b/kubernetes/config/docker/init/src/config/robot/eteshare/config/vm_properties.py
@@ -0,0 +1,17 @@
+# File generated from /opt/config
+#
+GLOBAL_VM_PROPERTIES = {
+ "artifacts_version" : "1.0.0",
+ "cloud_env" : "openstack",
+ "dns_ip_addr" : "10.43.0.10",
+ "docker_version" : "1.0-STAGING-latest",
+ "gerrit_branch" : "release-1.0.0",
+ "network" : "onap_oam",
+ "nexus_docker_repo" : "nexus3.onap.org:10001",
+ "nexus_password" : "docker",
+ "nexus_repo" : "https://nexus.onap.org/content/sites/raw",
+ "nexus_username" : "docker",
+ "openstack_password" : "dev",
+ "openstack_username" : "dev",
+ "region" : "RegionOne"
+ }
diff --git a/kubernetes/config/docker/init/src/config/robot/robot/assets/asdc/.gitignore b/kubernetes/config/docker/init/src/config/robot/robot/assets/asdc/.gitignore
new file mode 100644
index 0000000000..abe251a768
--- /dev/null
+++ b/kubernetes/config/docker/init/src/config/robot/robot/assets/asdc/.gitignore
@@ -0,0 +1 @@
+/temp \ No newline at end of file
diff --git a/kubernetes/config/docker/init/src/config/robot/robot/assets/asdc/base_vfw/MANIFEST.json b/kubernetes/config/docker/init/src/config/robot/robot/assets/asdc/base_vfw/MANIFEST.json
new file mode 100644
index 0000000000..a4e5cfd0ff
--- /dev/null
+++ b/kubernetes/config/docker/init/src/config/robot/robot/assets/asdc/base_vfw/MANIFEST.json
@@ -0,0 +1,17 @@
+{
+ "name": "virtualFireWall",
+ "description": "robot ete manifest",
+ "data": [
+ {
+ "file": "base_vfw.yaml",
+ "type": "HEAT",
+ "isBase": "true",
+ "data": [
+ {
+ "file": "base_vfw.env",
+ "type": "HEAT_ENV"
+ }
+ ]
+ }
+ ]
+} \ No newline at end of file
diff --git a/kubernetes/config/docker/init/src/config/robot/robot/assets/asdc/base_vfw/base_vfw.env b/kubernetes/config/docker/init/src/config/robot/robot/assets/asdc/base_vfw/base_vfw.env
new file mode 100644
index 0000000000..a23f51a53b
--- /dev/null
+++ b/kubernetes/config/docker/init/src/config/robot/robot/assets/asdc/base_vfw/base_vfw.env
@@ -0,0 +1,4 @@
+parameters:
+ vfw_image_name: UBUNTU_14_IMAGE_NAME_HERE
+ vfw_flavor_name: OPENSTACK_FLAVOUR_NAME_HERE
+ public_net_id: OPENSTACK_NETWORK_ID_WITH_INTERNET_HERE
diff --git a/kubernetes/config/docker/init/src/config/robot/robot/assets/asdc/base_vfw/base_vfw.yaml b/kubernetes/config/docker/init/src/config/robot/robot/assets/asdc/base_vfw/base_vfw.yaml
new file mode 100644
index 0000000000..a7df854a8d
--- /dev/null
+++ b/kubernetes/config/docker/init/src/config/robot/robot/assets/asdc/base_vfw/base_vfw.yaml
@@ -0,0 +1,423 @@
+heat_template_version: 2013-05-23
+
+description: Heat template to deploy vFirewall demo app for OpenECOMP
+
+parameters:
+ vfw_image_name:
+ type: string
+ label: Image name or ID
+ description: Image to be used for compute instance
+ vfw_flavor_name:
+ type: string
+ label: Flavor
+ description: Type of instance (flavor) to be used
+ public_net_id:
+ type: string
+ label: Public network name or ID
+ description: Public network that enables remote connection to VNF
+ unprotected_private_net_id:
+ type: string
+ label: Unprotected private network name or ID
+ description: Private network that connects vPacketGenerator with vFirewall
+ protected_private_net_id:
+ type: string
+ label: Protected private network name or ID
+ description: Private network that connects vFirewall with vSink
+ ecomp_private_net_id:
+ type: string
+ label: ECOMP management network name or ID
+ description: Private network that connects ECOMP component and the VNF
+ ecomp_private_subnet_id:
+ type: string
+ label: ECOMP management sub-network name or ID
+ description: Private sub-network that connects ECOMP component and the VNF
+ unprotected_private_net_cidr:
+ type: string
+ label: Unprotected private network CIDR
+ description: The CIDR of the unprotected private network
+ protected_private_net_cidr:
+ type: string
+ label: Protected private network CIDR
+ description: The CIDR of the protected private network
+ ecomp_private_net_cidr:
+ type: string
+ label: ECOMP private network CIDR
+ description: The CIDR of the protected private network
+ vfw_private_ip_0:
+ type: string
+ label: vFirewall private IP address towards the unprotected network
+ description: Private IP address that is assigned to the vFirewall to communicate with the vPacketGenerator
+ vfw_private_ip_1:
+ type: string
+ label: vFirewall private IP address towards the protected network
+ description: Private IP address that is assigned to the vFirewall to communicate with the vSink
+ vfw_private_ip_2:
+ type: string
+ label: vFirewall private IP address towards the ECOMP management network
+ description: Private IP address that is assigned to the vFirewall to communicate with ECOMP components
+ vpg_private_ip_0:
+ type: string
+ label: vPacketGenerator private IP address towards the unprotected network
+ description: Private IP address that is assigned to the vPacketGenerator to communicate with the vFirewall
+ vpg_private_ip_1:
+ type: string
+ label: vPacketGenerator private IP address towards the ECOMP management network
+ description: Private IP address that is assigned to the vPacketGenerator to communicate with ECOMP components
+ vsn_private_ip_0:
+ type: string
+ label: vSink private IP address towards the protected network
+ description: Private IP address that is assigned to the vSink to communicate with the vFirewall
+ vsn_private_ip_1:
+ type: string
+ label: vSink private IP address towards the ECOMP management network
+ description: Private IP address that is assigned to the vSink to communicate with ECOMP components
+ vfw_name_0:
+ type: string
+ label: vFirewall name
+ description: Name of the vFirewall
+ vpg_name_0:
+ type: string
+ label: vPacketGenerator name
+ description: Name of the vPacketGenerator
+ vsn_name_0:
+ type: string
+ label: vSink name
+ description: Name of the vSink
+ vnf_id:
+ type: string
+ label: VNF ID
+ description: The VNF ID is provided by ECOMP
+ vf_module_id:
+ type: string
+ label: vFirewall module ID
+ description: The vFirewall Module ID is provided by ECOMP
+ dcae_collector_ip:
+ type: string
+ label: DCAE collector IP address
+ description: IP address of the DCAE collector
+ dcae_collector_port:
+ type: string
+ label: DCAE collector port
+ description: Port of the DCAE collector
+ key_name:
+ type: string
+ label: Key pair name
+ description: Public/Private key pair name
+ pub_key:
+ type: string
+ label: Public key
+ description: Public key to be installed on the compute instance
+ repo_url_blob:
+ type: string
+ label: Repository URL
+ description: URL of the repository that hosts the demo packages
+ repo_url_artifacts:
+ type: string
+ label: Repository URL
+ description: URL of the repository that hosts the demo packages
+ demo_artifacts_version:
+ type: string
+ label: Artifacts version used in demo vnfs
+ description: Artifacts (jar, tar.gz) version used in demo vnfs
+
+resources:
+
+ random-str:
+ type: OS::Heat::RandomString
+ properties:
+ length: 4
+
+ my_keypair:
+ type: OS::Nova::KeyPair
+ properties:
+ name:
+ str_replace:
+ template: base_rand
+ params:
+ base: { get_param: key_name }
+ rand: { get_resource: random-str }
+ public_key: { get_param: pub_key }
+ save_private_key: false
+
+ unprotected_private_network:
+ type: OS::Neutron::Net
+ properties:
+ name: { get_param: unprotected_private_net_id }
+
+ protected_private_network:
+ type: OS::Neutron::Net
+ properties:
+ name: { get_param: protected_private_net_id }
+
+ unprotected_private_subnet:
+ type: OS::Neutron::Subnet
+ properties:
+ network_id: { get_resource: unprotected_private_network }
+ cidr: { get_param: unprotected_private_net_cidr }
+
+ protected_private_subnet:
+ type: OS::Neutron::Subnet
+ properties:
+ network_id: { get_resource: protected_private_network }
+ cidr: { get_param: protected_private_net_cidr }
+
+ vfw_0:
+ type: OS::Nova::Server
+ properties:
+ image: { get_param: vfw_image_name }
+ flavor: { get_param: vfw_flavor_name }
+ name: { get_param: vfw_name_0 }
+ key_name: { get_resource: my_keypair }
+ networks:
+ - network: { get_param: public_net_id }
+ - port: { get_resource: vfw_private_0_port }
+ - port: { get_resource: vfw_private_1_port }
+ - port: { get_resource: vfw_private_2_port }
+ metadata: {vnf_id: { get_param: vnf_id }, vf_module_id: { get_param: vf_module_id }}
+ user_data_format: RAW
+ user_data:
+ str_replace:
+ params:
+ __dcae_collector_ip__ : { get_param: dcae_collector_ip }
+ __dcae_collector_port__ : { get_param: dcae_collector_port }
+ __repo_url_blob__ : { get_param: repo_url_blob }
+ __repo_url_artifacts__ : { get_param: repo_url_artifacts }
+ __demo_artifacts_version__ : { get_param: demo_artifacts_version }
+ template: |
+ #!/bin/bash
+
+ DCAE_COLLECTOR_IP=__dcae_collector_ip__
+ DCAE_COLLECTOR_PORT=__dcae_collector_port__
+ REPO_URL_BLOB=__repo_url_blob__
+ REPO_URL_ARTIFACTS=__repo_url_artifacts__
+ DEMO_ARTIFACTS_VERSION=__demo_artifacts_version__
+
+ # Download required dependencies
+ add-apt-repository -y ppa:openjdk-r/ppa
+ apt-get update
+ apt-get install -y make wget openjdk-8-jdk gcc libcurl4-openssl-dev python-pip bridge-utils apt-transport-https ca-certificates
+ apt-get install -y maven
+ pip install jsonschema
+
+ # Download vFirewall code for virtual firewall
+ mkdir /opt/config
+ mkdir /opt/honeycomb
+ cd /opt
+ wget $REPO_URL_BLOB/org.openecomp.demo/vnfs/vfw/$DEMO_ARTIFACTS_VERSION/v_firewall_init.sh
+ wget $REPO_URL_BLOB/org.openecomp.demo/vnfs/vfw/$DEMO_ARTIFACTS_VERSION/vfirewall.sh
+
+ mvn org.apache.maven.plugins:maven-dependency-plugin:2.10:get -DremoteRepositories=$REPO_URL_ARTIFACTS -Dartifact=org.openecomp.demo.vnf:sample-distribution:$DEMO_ARTIFACTS_VERSION:tar.gz:hc -Dtransitive=false -Ddest=.
+ mvn org.apache.maven.plugins:maven-dependency-plugin:2.10:get -DremoteRepositories=$REPO_URL_ARTIFACTS -Dartifact=org.openecomp.demo.vnf.ves:ves:$DEMO_ARTIFACTS_VERSION:tar.gz:demo -Dtransitive=false -Ddest=.
+ mvn org.apache.maven.plugins:maven-dependency-plugin:2.10:get -DremoteRepositories=$REPO_URL_ARTIFACTS -Dartifact=org.openecomp.demo.vnf.ves:ves_vfw_reporting:$DEMO_ARTIFACTS_VERSION:tar.gz:demo -Dtransitive=false -Ddest=.
+
+
+ tar -zxvf ves-$DEMO_ARTIFACTS_VERSION-demo.tar.gz
+ mv ves-$DEMO_ARTIFACTS_VERSION VES
+ tar -zxvf ves_vfw_reporting-$DEMO_ARTIFACTS_VERSION-demo.tar.gz
+ mv ves_vfw_reporting-$DEMO_ARTIFACTS_VERSION VESreporting_vFW
+ tar -zxvf sample-distribution-$DEMO_ARTIFACTS_VERSION-hc.tar.gz
+ mv sample-distribution-$DEMO_ARTIFACTS_VERSION honeycomb
+ sed -i 's/"restconf-binding-address": "127.0.0.1",/"restconf-binding-address": "0.0.0.0",/g' honeycomb/sample-distribution-$DEMO_ARTIFACTS_VERSION/config/honeycomb.json
+ mv VESreporting_vFW /opt/VES/code/evel_training/VESreporting
+ rm *.tar.gz
+ chmod +x v_firewall_init.sh
+ chmod +x vfirewall.sh
+ echo $DCAE_COLLECTOR_IP > config/dcae_collector_ip.txt
+ echo $DCAE_COLLECTOR_PORT > config/dcae_collector_port.txt
+ echo $DEMO_ARTIFACTS_VERSION > config/artifacts_version.txt
+
+ # Install VPP
+ export UBUNTU="trusty"
+ export RELEASE=".stable.1609"
+ rm /etc/apt/sources.list.d/99fd.io.list
+ echo "deb [trusted=yes] https://nexus.fd.io/content/repositories/fd.io$RELEASE.ubuntu.$UBUNTU.main/ ./" | sudo tee -a /etc/apt/sources.list.d/99fd.io.list
+ apt-get update
+ apt-get install -y vpp vpp-dpdk-dkms vpp-lib vpp-dbg vpp-plugins vpp-dev
+ sleep 1
+
+ # Install VES
+ cd /opt/VES/bldjobs/
+ make clean
+ make
+ sleep 1
+
+ # Run instantiation script
+ cd /opt
+ mv vfirewall.sh /etc/init.d
+ update-rc.d vfirewall.sh defaults
+ ./v_firewall_init.sh
+
+ vfw_private_0_port:
+ type: OS::Neutron::Port
+ properties:
+ network: { get_resource: unprotected_private_network }
+ fixed_ips: [{"subnet": { get_resource: unprotected_private_subnet }, "ip_address": { get_param: vfw_private_ip_0 }}]
+
+ vfw_private_1_port:
+ type: OS::Neutron::Port
+ properties:
+ network: { get_resource: protected_private_network }
+ fixed_ips: [{"subnet": { get_resource: protected_private_subnet }, "ip_address": { get_param: vfw_private_ip_1 }}]
+
+ vfw_private_2_port:
+ type: OS::Neutron::Port
+ properties:
+ network: { get_param: ecomp_private_net_id }
+ fixed_ips: [{"subnet": { get_param: ecomp_private_subnet_id }, "ip_address": { get_param: vfw_private_ip_2 }}]
+
+ vpg_0:
+ type: OS::Nova::Server
+ properties:
+ image: { get_param: vfw_image_name }
+ flavor: { get_param: vfw_flavor_name }
+ name: { get_param: vpg_name_0 }
+ key_name: { get_resource: my_keypair }
+ networks:
+ - network: { get_param: public_net_id }
+ - port: { get_resource: vpg_private_0_port }
+ - port: { get_resource: vpg_private_1_port }
+ metadata: {vnf_id: { get_param: vnf_id }, vf_module_id: { get_param: vf_module_id }}
+ user_data_format: RAW
+ user_data:
+ str_replace:
+ params:
+ __fw_ipaddr__: { get_param: vfw_private_ip_0 }
+ __protected_net_cidr__: { get_param: protected_private_net_cidr }
+ __sink_ipaddr__: { get_param: vsn_private_ip_0 }
+ __repo_url_blob__ : { get_param: repo_url_blob }
+ __repo_url_artifacts__ : { get_param: repo_url_artifacts }
+ __demo_artifacts_version__ : { get_param: demo_artifacts_version }
+ template: |
+ #!/bin/bash
+
+ FW_IPADDR=__fw_ipaddr__
+ PROTECTED_NET_CIDR=__protected_net_cidr__
+ SINK_IPADDR=__sink_ipaddr__
+ REPO_URL_BLOB=__repo_url_blob__
+ REPO_URL_ARTIFACTS=__repo_url_artifacts__
+ DEMO_ARTIFACTS_VERSION=__demo_artifacts_version__
+
+ # Download required dependencies
+ add-apt-repository -y ppa:openjdk-r/ppa
+ apt-get update
+ apt-get install -y make wget openjdk-8-jdk gcc libcurl4-openssl-dev python-pip bridge-utils apt-transport-https ca-certificates
+ apt-get install -y maven
+ pip install jsonschema
+
+ # Download vFirewall demo code for packet generator
+ mkdir /opt/config
+ mkdir /opt/honeycomb
+ cd /opt
+
+ wget $REPO_URL_BLOB/org.openecomp.demo/vnfs/vfw/$DEMO_ARTIFACTS_VERSION/v_packetgen_init.sh
+ wget $REPO_URL_BLOB/org.openecomp.demo/vnfs/vfw/$DEMO_ARTIFACTS_VERSION/vpacketgen.sh
+ wget $REPO_URL_BLOB/org.openecomp.demo/vnfs/vfw/$DEMO_ARTIFACTS_VERSION/run_traffic_fw_demo.sh
+
+ mvn org.apache.maven.plugins:maven-dependency-plugin:2.10:get -DremoteRepositories=$REPO_URL_ARTIFACTS -Dartifact=org.openecomp.demo.vnf:sample-distribution:$DEMO_ARTIFACTS_VERSION:tar.gz:hc -Dtransitive=false -Ddest=.
+ mvn org.apache.maven.plugins:maven-dependency-plugin:2.10:get -DremoteRepositories=$REPO_URL_ARTIFACTS -Dartifact=org.openecomp.demo.vnf.vfw:vfw_pg_streams:$DEMO_ARTIFACTS_VERSION:tar.gz:demo -Dtransitive=false -Ddest=.
+
+
+ tar -zxvf sample-distribution-$DEMO_ARTIFACTS_VERSION-hc.tar.gz
+ tar -zxvf vfw_pg_streams-$DEMO_ARTIFACTS_VERSION-demo.tar.gz
+ mv vfw_pg_streams-$DEMO_ARTIFACTS_VERSION pg_streams
+ mv sample-distribution-$DEMO_ARTIFACTS_VERSION honeycomb
+ sed -i 's/"restconf-binding-address": "127.0.0.1",/"restconf-binding-address": "0.0.0.0",/g' honeycomb/sample-distribution-$DEMO_ARTIFACTS_VERSION/config/honeycomb.json
+ rm *.tar.gz
+ chmod +x v_packetgen_init.sh
+ chmod +x vpacketgen.sh
+ echo $FW_IPADDR > config/fw_ipaddr.txt
+ echo $PROTECTED_NET_CIDR > config/protected_net_cidr.txt
+ echo $SINK_IPADDR > config/sink_ipaddr.txt
+ echo $DEMO_ARTIFACTS_VERSION > config/artifacts_version.txt
+
+ # Install VPP
+ export UBUNTU="trusty"
+ export RELEASE=".stable.1609"
+ rm /etc/apt/sources.list.d/99fd.io.list
+ echo "deb [trusted=yes] https://nexus.fd.io/content/repositories/fd.io$RELEASE.ubuntu.$UBUNTU.main/ ./" | sudo tee -a /etc/apt/sources.list.d/99fd.io.list
+ apt-get update
+ apt-get install -y vpp vpp-dpdk-dkms vpp-lib vpp-dbg vpp-plugins vpp-dev
+ sleep 1
+
+ # Run instantiation script
+ cd /opt
+ mv vpacketgen.sh /etc/init.d
+ update-rc.d vpacketgen.sh defaults
+ ./v_packetgen_init.sh
+
+ vpg_private_0_port:
+ type: OS::Neutron::Port
+ properties:
+ network: { get_resource: unprotected_private_network }
+ fixed_ips: [{"subnet": { get_resource: unprotected_private_subnet }, "ip_address": { get_param: vpg_private_ip_0 }}]
+
+ vpg_private_1_port:
+ type: OS::Neutron::Port
+ properties:
+ network: { get_param: ecomp_private_net_id }
+ fixed_ips: [{"subnet": { get_param: ecomp_private_subnet_id }, "ip_address": { get_param: vpg_private_ip_1 }}]
+
+ vsn_0:
+ type: OS::Nova::Server
+ properties:
+ image: { get_param: vfw_image_name }
+ flavor: { get_param: vfw_flavor_name }
+ name: { get_param: vsn_name_0 }
+ key_name: { get_resource: my_keypair }
+ networks:
+ - network: { get_param: public_net_id }
+ - port: { get_resource: vsn_private_0_port }
+ - port: { get_resource: vsn_private_1_port }
+ metadata: {vnf_id: { get_param: vnf_id }, vf_module_id: { get_param: vf_module_id }}
+ user_data_format: RAW
+ user_data:
+ str_replace:
+ params:
+ __protected_net_gw__: { get_param: vfw_private_ip_1 }
+ __unprotected_net__: { get_param: unprotected_private_net_cidr }
+ __repo_url_blob__ : { get_param: repo_url_blob }
+ __repo_url_artifacts__ : { get_param: repo_url_artifacts }
+ __demo_artifacts_version__ : { get_param: demo_artifacts_version }
+ template: |
+ #!/bin/bash
+
+ PROTECTED_NET_GW=__protected_net_gw__
+ UNPROTECTED_NET=__unprotected_net__
+ UNPROTECTED_NET=$(echo $UNPROTECTED_NET | cut -d'/' -f1)
+ REPO_URL_BLOB=__repo_url_blob__
+ REPO_URL_ARTIFACTS=__repo_url_artifacts__
+ DEMO_ARTIFACTS_VERSION=__demo_artifacts_version__
+
+ # Download required dependencies
+ add-apt-repository -y ppa:openjdk-r/ppa
+ apt-get update
+ apt-get install -y make wget openjdk-8-jdk apt-transport-https ca-certificates darkstat
+
+ # Configure and run darkstat
+ sed -i "s/START_DARKSTAT=.*/START_DARKSTAT=yes/g" /etc/darkstat/init.cfg
+ sed -i "s/INTERFACE=.*/INTERFACE=\"-i eth1\"/g" /etc/darkstat/init.cfg
+ /etc/init.d/darkstat start
+
+ mkdir /opt/config
+ cd /opt
+ wget $REPO_URL_BLOB/org.openecomp.demo/vnfs/vfw/$DEMO_ARTIFACTS_VERSION/v_sink_init.sh
+ wget $REPO_URL_BLOB/org.openecomp.demo/vnfs/vfw/$DEMO_ARTIFACTS_VERSION/vsink.sh
+ chmod +x v_sink_init.sh
+ chmod +x vsink.sh
+ echo $PROTECTED_NET_GW > config/protected_net_gw.txt
+ echo $UNPROTECTED_NET > config/unprotected_net.txt
+ mv vsink.sh /etc/init.d
+ update-rc.d vsink.sh defaults
+ ./v_sink_init.sh
+
+ vsn_private_0_port:
+ type: OS::Neutron::Port
+ properties:
+ network: { get_resource: protected_private_network }
+ fixed_ips: [{"subnet": { get_resource: protected_private_subnet }, "ip_address": { get_param: vsn_private_ip_0 }}]
+
+ vsn_private_1_port:
+ type: OS::Neutron::Port
+ properties:
+ network: { get_param: ecomp_private_net_id }
+ fixed_ips: [{"subnet": { get_param: ecomp_private_subnet_id }, "ip_address": { get_param: vsn_private_ip_1 }}]
diff --git a/kubernetes/config/docker/init/src/config/robot/robot/assets/asdc/base_vlb/MANIFEST.json b/kubernetes/config/docker/init/src/config/robot/robot/assets/asdc/base_vlb/MANIFEST.json
new file mode 100644
index 0000000000..bb8d70a138
--- /dev/null
+++ b/kubernetes/config/docker/init/src/config/robot/robot/assets/asdc/base_vlb/MANIFEST.json
@@ -0,0 +1,28 @@
+{
+ "name": "virtualLoadBalancer",
+ "description": "robot ete manifest",
+ "data": [
+ {
+ "file": "base_vlb.yaml",
+ "type": "HEAT",
+ "isBase": "true",
+ "data": [
+ {
+ "file": "base_vlb.env",
+ "type": "HEAT_ENV"
+ }
+ ]
+ },
+ {
+ "file": "dnsscaling.yaml",
+ "type": "HEAT",
+ "isBase": "false",
+ "data": [
+ {
+ "file": "dnsscaling.env",
+ "type": "HEAT_ENV"
+ }
+ ]
+ }
+ ]
+} \ No newline at end of file
diff --git a/kubernetes/config/docker/init/src/config/robot/robot/assets/asdc/base_vlb/base_vlb.env b/kubernetes/config/docker/init/src/config/robot/robot/assets/asdc/base_vlb/base_vlb.env
new file mode 100644
index 0000000000..b5b796a76f
--- /dev/null
+++ b/kubernetes/config/docker/init/src/config/robot/robot/assets/asdc/base_vlb/base_vlb.env
@@ -0,0 +1,4 @@
+parameters:
+ vlb_image_name: UBUNTU_14_IMAGE_NAME_HERE
+ vlb_flavor_name: OPENSTACK_FLAVOUR_NAME_HERE
+ public_net_id: OPENSTACK_NETWORK_ID_WITH_INTERNET_HERE
diff --git a/kubernetes/config/docker/init/src/config/robot/robot/assets/asdc/base_vlb/base_vlb.yaml b/kubernetes/config/docker/init/src/config/robot/robot/assets/asdc/base_vlb/base_vlb.yaml
new file mode 100644
index 0000000000..c292f2957d
--- /dev/null
+++ b/kubernetes/config/docker/init/src/config/robot/robot/assets/asdc/base_vlb/base_vlb.yaml
@@ -0,0 +1,339 @@
+heat_template_version: 2013-05-23
+
+description: Heat template to deploy vLoadBalancer/vDNS demo app for OpenECOMP
+
+parameters:
+ vlb_image_name:
+ type: string
+ label: Image name or ID
+ description: Image to be used for compute instance
+ vlb_flavor_name:
+ type: string
+ label: Flavor
+ description: Type of instance (flavor) to be used
+ public_net_id:
+ type: string
+ label: Public network name or ID
+ description: Public network that enables remote connection to VNF
+ vlb_private_net_id:
+ type: string
+ label: vLoadBalancer private network name or ID
+ description: Private network that connects vLoadBalancer with vDNSs
+ ecomp_private_net_id:
+ type: string
+ label: ECOMP management network name or ID
+ description: Private network that connects ECOMP component and the VNF
+ ecomp_private_subnet_id:
+ type: string
+ label: ECOMP management sub-network name or ID
+ description: Private sub-network that connects ECOMP component and the VNF
+ vlb_private_net_cidr:
+ type: string
+ label: vLoadBalancer private network CIDR
+ description: The CIDR of the vLoadBalancer private network
+ ecomp_private_net_cidr:
+ type: string
+ label: ECOMP private network CIDR
+ description: The CIDR of the protected private network
+ vlb_private_ip_0:
+ type: string
+ label: vLoadBalancer private IP address towards the private network
+ description: Private IP address that is assigned to the vLoadBalancer to communicate with the vDNSs
+ vlb_private_ip_1:
+ type: string
+ label: vLoadBalancer private IP address towards the ECOMP management network
+ description: Private IP address that is assigned to the vLoadBalancer to communicate with ECOMP components
+ vdns_private_ip_0:
+ type: string
+ label: vDNS private IP address towards the private network
+ description: Private IP address that is assigned to the vDNS to communicate with the vLoadBalancer
+ vdns_private_ip_1:
+ type: string
+ label: vDNS private IP address towards the ECOMP management network
+ description: Private IP address that is assigned to the vDNS to communicate with ECOMP components
+ vlb_name_0:
+ type: string
+ label: vLoadBalancer name
+ description: Name of the vLoadBalancer
+ vdns_name_0:
+ type: string
+ label: vDNS name
+ description: Name of the vDNS
+ vnf_id:
+ type: string
+ label: VNF ID
+ description: The VNF ID is provided by ECOMP
+ vf_module_id:
+ type: string
+ label: vFirewall module ID
+ description: The vLoadBalancer Module ID is provided by ECOMP
+ dcae_collector_ip:
+ type: string
+ label: DCAE collector IP address
+ description: IP address of the DCAE collector
+ dcae_collector_port:
+ type: string
+ label: DCAE collector port
+ description: Port of the DCAE collector
+ key_name:
+ type: string
+ label: Key pair name
+ description: Public/Private key pair name
+ pub_key:
+ type: string
+ label: Public key
+ description: Public key to be installed on the compute instance
+ repo_url_blob:
+ type: string
+ label: Repository URL
+ description: URL of the repository that hosts the demo packages
+ repo_url_artifacts:
+ type: string
+ label: Repository URL
+ description: URL of the repository that hosts the demo packages
+ demo_artifacts_version:
+ type: string
+ label: Artifacts version used in demo vnfs
+ description: Artifacts (jar, tar.gz) version used in demo vnfs
+
+resources:
+
+ random-str:
+ type: OS::Heat::RandomString
+ properties:
+ length: 4
+
+ my_keypair:
+ type: OS::Nova::KeyPair
+ properties:
+ name:
+ str_replace:
+ template: base_rand
+ params:
+ base: { get_param: key_name }
+ rand: { get_resource: random-str }
+ public_key: { get_param: pub_key }
+ save_private_key: false
+
+ vlb_private_network:
+ type: OS::Neutron::Net
+ properties:
+ name: { get_param: vlb_private_net_id }
+
+ vlb_private_subnet:
+ type: OS::Neutron::Subnet
+ properties:
+ name: { get_param: vlb_private_net_id }
+ network_id: { get_resource: vlb_private_network }
+ cidr: { get_param: vlb_private_net_cidr }
+
+ vlb_0:
+ type: OS::Nova::Server
+ properties:
+ image: { get_param: vlb_image_name }
+ flavor: { get_param: vlb_flavor_name }
+ name: { get_param: vlb_name_0 }
+ key_name: { get_resource: my_keypair }
+ networks:
+ - network: { get_param: public_net_id }
+ - port: { get_resource: vlb_private_0_port }
+ - port: { get_resource: vlb_private_1_port }
+ metadata: {vnf_id: { get_param: vnf_id }, vf_module_id: { get_param: vf_module_id }}
+ user_data_format: RAW
+ user_data:
+ str_replace:
+ params:
+ __dcae_collector_ip__: { get_param: dcae_collector_ip }
+ __dcae_collector_port__: { get_param: dcae_collector_port }
+ __local_private_ipaddr__: { get_param: vlb_private_ip_0 }
+ __repo_url_blob__ : { get_param: repo_url_blob }
+ __repo_url_artifacts__ : { get_param: repo_url_artifacts }
+ __demo_artifacts_version__ : { get_param: demo_artifacts_version }
+ template: |
+ #!/bin/bash
+
+ DCAE_COLLECTOR_IP=__dcae_collector_ip__
+ DCAE_COLLECTOR_PORT=__dcae_collector_port__
+ LOCAL_PRIVATE_IPADDR=__local_private_ipaddr__
+ REPO_URL_BLOB=__repo_url_blob__
+ REPO_URL_ARTIFACTS=__repo_url_artifacts__
+ DEMO_ARTIFACTS_VERSION=__demo_artifacts_version__
+
+ # Download required dependencies
+ add-apt-repository -y ppa:openjdk-r/ppa
+ apt-get update
+ apt-get install -y make gcc wget openjdk-8-jdk bridge-utils libcurl4-openssl-dev apt-transport-https ca-certificates
+ apt-get install -y maven
+ sleep 1
+
+ # Download vLB demo code for load balancer
+ mkdir /opt/config
+ mkdir /opt/FDserver
+ cd /opt
+
+ wget $REPO_URL_BLOB/org.openecomp.demo/vnfs/vlb/$DEMO_ARTIFACTS_VERSION/v_lb_init.sh
+ wget $REPO_URL_BLOB/org.openecomp.demo/vnfs/vlb/$DEMO_ARTIFACTS_VERSION/vlb.sh
+ wget $REPO_URL_BLOB/org.openecomp.demo/vnfs/vlb/$DEMO_ARTIFACTS_VERSION/dnsmembership.sh
+ wget $REPO_URL_BLOB/org.openecomp.demo/vnfs/vlb/$DEMO_ARTIFACTS_VERSION/add_dns.sh
+ wget $REPO_URL_BLOB/org.openecomp.demo/vnfs/vlb/$DEMO_ARTIFACTS_VERSION/remove_dns.sh
+
+ mvn org.apache.maven.plugins:maven-dependency-plugin:2.10:get -DremoteRepositories=$REPO_URL_ARTIFACTS -Dartifact=org.openecomp.demo.vnf.vlb:dns-manager:$DEMO_ARTIFACTS_VERSION:jar -Dtransitive=false -Ddest=.
+ mvn org.apache.maven.plugins:maven-dependency-plugin:2.10:get -DremoteRepositories=$REPO_URL_ARTIFACTS -Dartifact=org.openecomp.demo.vnf.ves:ves:$DEMO_ARTIFACTS_VERSION:tar.gz:demo -Dtransitive=false -Ddest=.
+ mvn org.apache.maven.plugins:maven-dependency-plugin:2.10:get -DremoteRepositories=$REPO_URL_ARTIFACTS -Dartifact=org.openecomp.demo.vnf.ves:ves_vlb_reporting:$DEMO_ARTIFACTS_VERSION:tar.gz:demo -Dtransitive=false -Ddest=.
+
+ tar -zxvf ves-$DEMO_ARTIFACTS_VERSION-demo.tar.gz
+ mv ves-$DEMO_ARTIFACTS_VERSION VES
+ tar -zxvf ves_vlb_reporting-$DEMO_ARTIFACTS_VERSION-demo.tar.gz
+ mv ves_vlb_reporting-$DEMO_ARTIFACTS_VERSION VESreporting_vLB
+
+ mv VESreporting_vLB /opt/VES/code/evel_training/VESreporting
+ mv dns-manager-$DEMO_ARTIFACTS_VERSION.jar /opt/FDserver/dns-manager-$DEMO_ARTIFACTS_VERSION.jar
+ mv dnsmembership.sh /opt/FDserver/dnsmembership.sh
+ mv add_dns.sh /opt/FDserver/add_dns.sh
+ mv remove_dns.sh /opt/FDserver/remove_dns.sh
+ rm *.tar.gz
+
+ chmod +x v_lb_init.sh
+ chmod +x vlb.sh
+ chmod +x /opt/VES/code/evel_training/VESreporting/go-client.sh
+ chmod +x /opt/FDserver/dnsmembership.sh
+ chmod +x /opt/FDserver/add_dns.sh
+ chmod +x /opt/FDserver/remove_dns.sh
+
+ echo $DCAE_COLLECTOR_IP > config/dcae_collector_ip.txt
+ echo $DCAE_COLLECTOR_PORT > config/dcae_collector_port.txt
+ echo $LOCAL_PRIVATE_IPADDR > config/local_private_ipaddr.txt
+ LOCAL_PUBLIC_IPADDR=$(ifconfig eth0 | grep "inet addr" | tr -s ' ' | cut -d' ' -f3 | cut -d':' -f2)
+ echo $LOCAL_PUBLIC_IPADDR > config/local_public_ipaddr.txt
+ echo $DEMO_ARTIFACTS_VERSION > config/artifacts_version.txt
+
+ # Install VPP
+ export UBUNTU="trusty"
+ export RELEASE=".stable.1609"
+ rm /etc/apt/sources.list.d/99fd.io.list
+ echo "deb [trusted=yes] https://nexus.fd.io/content/repositories/fd.io$RELEASE.ubuntu.$UBUNTU.main/ ./" | sudo tee -a /etc/apt/sources.list.d/99fd.io.list
+ apt-get update
+ apt-get install -y vpp vpp-dpdk-dkms vpp-lib vpp-dbg vpp-plugins vpp-dev
+ sleep 1
+
+ # Install VES
+ cd /opt/VES/bldjobs/
+ make clean
+ make
+ sleep 1
+
+ # Run instantiation script
+ cd /opt
+ mv vlb.sh /etc/init.d
+ update-rc.d vlb.sh defaults
+ ./v_lb_init.sh
+
+ vlb_private_0_port:
+ type: OS::Neutron::Port
+ properties:
+ network: { get_resource: vlb_private_network }
+ fixed_ips: [{"subnet": { get_resource: vlb_private_subnet }, "ip_address": { get_param: vlb_private_ip_0 }}]
+
+ vlb_private_1_port:
+ type: OS::Neutron::Port
+ properties:
+ network: { get_param: ecomp_private_net_id }
+ fixed_ips: [{"subnet": { get_param: ecomp_private_subnet_id }, "ip_address": { get_param: vlb_private_ip_1 }}]
+
+ vdns_0:
+ type: OS::Nova::Server
+ properties:
+ image: { get_param: vlb_image_name }
+ flavor: { get_param: vlb_flavor_name }
+ name: { get_param: vdns_name_0 }
+ key_name: { get_resource: my_keypair }
+ networks:
+ - network: { get_param: public_net_id }
+ - port: { get_resource: vdns_private_0_port }
+ - port: { get_resource: vdns_private_1_port }
+ metadata: {vnf_id: { get_param: vnf_id }, vf_module_id: { get_param: vf_module_id }}
+ user_data_format: RAW
+ user_data:
+ str_replace:
+ params:
+ __lb_oam_int__ : { get_param: vlb_private_ip_1 }
+ __lb_private_ipaddr__: { get_param: vlb_private_ip_0 }
+ __local_private_ipaddr__: { get_param: vdns_private_ip_0 }
+ __repo_url_blob__ : { get_param: repo_url_blob }
+ __repo_url_artifacts__ : { get_param: repo_url_artifacts }
+ __demo_artifacts_version__ : { get_param: demo_artifacts_version }
+ template: |
+ #!/bin/bash
+
+ LB_OAM_INT=__lb_oam_int__
+ LB_PRIVATE_IPADDR=__lb_private_ipaddr__
+ LOCAL_PRIVATE_IPADDR=__local_private_ipaddr__
+ REPO_URL_BLOB=__repo_url_blob__
+ REPO_URL_ARTIFACTS=__repo_url_artifacts__
+ DEMO_ARTIFACTS_VERSION=__demo_artifacts_version__
+
+ # Download required dependencies
+ add-apt-repository -y ppa:openjdk-r/ppa
+ apt-get update
+ apt-get install -y wget openjdk-8-jdk bind9 bind9utils bind9-doc apt-transport-https ca-certificates
+ apt-get install -y maven
+ sleep 1
+
+ # Download vDNS demo code for DNS Server
+ mkdir /opt/config
+ mkdir /opt/FDclient
+ cd /opt
+
+ wget $REPO_URL_BLOB/org.openecomp.demo/vnfs/vlb/$DEMO_ARTIFACTS_VERSION/v_dns_init.sh
+ wget $REPO_URL_BLOB/org.openecomp.demo/vnfs/vlb/$DEMO_ARTIFACTS_VERSION/vdns.sh
+ wget $REPO_URL_BLOB/org.openecomp.demo/vnfs/vlb/$DEMO_ARTIFACTS_VERSION/dnsclient.sh
+ wget $REPO_URL_BLOB/org.openecomp.demo/vnfs/vlb/$DEMO_ARTIFACTS_VERSION/set_gre_tunnel.sh
+
+ mvn org.apache.maven.plugins:maven-dependency-plugin:2.10:get -DremoteRepositories=$REPO_URL_ARTIFACTS -Dartifact=org.openecomp.demo.vnf.vlb:dns-client:$DEMO_ARTIFACTS_VERSION:jar -Dtransitive=false -Ddest=.
+
+ mv dns-client-$DEMO_ARTIFACTS_VERSION.jar /opt/FDclient/
+ mv dnsclient.sh /opt/FDclient/
+ mv set_gre_tunnel.sh /opt/FDclient/
+
+ chmod +x v_dns_init.sh
+ chmod +x vdns.sh
+ chmod +x /opt/FDclient/dnsclient.sh
+ chmod +x /opt/FDclient/set_gre_tunnel.sh
+
+ echo $LB_OAM_INT > config/lb_oam_int.txt
+ echo $LB_PRIVATE_IPADDR > config/lb_private_ipaddr.txt
+ echo $LOCAL_PRIVATE_IPADDR > config/local_private_ipaddr.txt
+ echo $DEMO_ARTIFACTS_VERSION > config/artifacts_version.txt
+
+ # Download Bind config files
+ cd /opt/config
+ wget $REPO_URL_BLOB/org.openecomp.demo/vnfs/vlb/$DEMO_ARTIFACTS_VERSION/db_dnsdemo_openecomp_org
+ wget $REPO_URL_BLOB/org.openecomp.demo/vnfs/vlb/$DEMO_ARTIFACTS_VERSION/named.conf.options
+ wget $REPO_URL_BLOB/org.openecomp.demo/vnfs/vlb/$DEMO_ARTIFACTS_VERSION/named.conf.local
+
+ # Configure Bind
+ modprobe ip_gre
+ mkdir /etc/bind/zones
+ sed -i "s/OPTIONS=.*/OPTIONS=\"-4 -u bind\"/g" /etc/default/bind9
+ mv db_dnsdemo_openecomp_org /etc/bind/zones/db.dnsdemo.openecomp.org
+ mv named.conf.options /etc/bind/
+ mv named.conf.local /etc/bind/
+ sleep 1
+
+ # Run instantiation script
+ cd /opt
+ mv vdns.sh /etc/init.d
+ update-rc.d vdns.sh defaults
+ ./v_dns_init.sh
+
+ vdns_private_0_port:
+ type: OS::Neutron::Port
+ properties:
+ network: { get_resource: vlb_private_network }
+ fixed_ips: [{"subnet": { get_resource: vlb_private_subnet }, "ip_address": { get_param: vdns_private_ip_0 }}]
+
+ vdns_private_1_port:
+ type: OS::Neutron::Port
+ properties:
+ network: { get_param: ecomp_private_net_id }
+ fixed_ips: [{"subnet": { get_param: ecomp_private_subnet_id }, "ip_address": { get_param: vdns_private_ip_1 }}]
diff --git a/kubernetes/config/docker/init/src/config/robot/robot/assets/asdc/base_vlb/dnsscaling.env b/kubernetes/config/docker/init/src/config/robot/robot/assets/asdc/base_vlb/dnsscaling.env
new file mode 100644
index 0000000000..b5b796a76f
--- /dev/null
+++ b/kubernetes/config/docker/init/src/config/robot/robot/assets/asdc/base_vlb/dnsscaling.env
@@ -0,0 +1,4 @@
+parameters:
+ vlb_image_name: UBUNTU_14_IMAGE_NAME_HERE
+ vlb_flavor_name: OPENSTACK_FLAVOUR_NAME_HERE
+ public_net_id: OPENSTACK_NETWORK_ID_WITH_INTERNET_HERE
diff --git a/kubernetes/config/docker/init/src/config/robot/robot/assets/asdc/base_vlb/dnsscaling.yaml b/kubernetes/config/docker/init/src/config/robot/robot/assets/asdc/base_vlb/dnsscaling.yaml
new file mode 100644
index 0000000000..003deb9103
--- /dev/null
+++ b/kubernetes/config/docker/init/src/config/robot/robot/assets/asdc/base_vlb/dnsscaling.yaml
@@ -0,0 +1,194 @@
+heat_template_version: 2013-05-23
+
+description: Heat template to deploy a vDNS for OpenECOMP (scaling-up scenario)
+
+parameters:
+ vlb_image_name:
+ type: string
+ label: Image name or ID
+ description: Image to be used for compute instance
+ vlb_flavor_name:
+ type: string
+ label: Flavor
+ description: Type of instance (flavor) to be used
+ public_net_id:
+ type: string
+ label: Public network name or ID
+ description: Public network that enables remote connection to VNF
+ vlb_private_net_id:
+ type: string
+ label: vLoadBalancer private network name or ID
+ description: Private network that connects vLoadBalancer with vDNSs
+ ecomp_private_net_id:
+ type: string
+ label: ECOMP management network name or ID
+ description: Private network that connects ECOMP component and the VNF
+ ecomp_private_subnet_id:
+ type: string
+ label: ECOMP management sub-network name or ID
+ description: Private sub-network that connects ECOMP component and the VNF
+ vlb_private_ip_0:
+ type: string
+ label: vLoadBalancer private IP address towards the private network
+ description: Private IP address that is assigned to the vLoadBalancer to communicate with the vDNSs
+ vlb_private_ip_1:
+ type: string
+ label: vLoadBalancer private IP address towards the ECOMP management network
+ description: Private IP address that is assigned to the vLoadBalancer to communicate with ECOMP components
+ vdns_private_ip_0:
+ type: string
+ label: vDNS private IP address towards the private network
+ description: Private IP address that is assigned to the vDNS to communicate with the vLoadBalancer
+ vdns_private_ip_1:
+ type: string
+ label: vDNS private IP address towards the ECOMP management network
+ description: Private IP address that is assigned to the vDNS to communicate with ECOMP components
+ vdns_name_0:
+ type: string
+ label: vDNS name
+ description: Name of the vDNS
+ vnf_id:
+ type: string
+ label: VNF ID
+ description: The VNF ID is provided by ECOMP
+ vf_module_id:
+ type: string
+ label: vFirewall module ID
+ description: The vLoadBalancer Module ID is provided by ECOMP
+ key_name:
+ type: string
+ label: Key pair name
+ description: Public/Private key pair name
+ pub_key:
+ type: string
+ label: Public key
+ description: Public key to be installed on the compute instance
+ repo_url_blob:
+ type: string
+ label: Repository URL
+ description: URL of the repository that hosts the demo packages
+ repo_url_artifacts:
+ type: string
+ label: Repository URL
+ description: URL of the repository that hosts the demo packages
+ demo_artifacts_version:
+ type: string
+ label: Artifacts version used in demo vnfs
+ description: Artifacts (jar, tar.gz) version used in demo vnfs
+
+resources:
+
+ random-str:
+ type: OS::Heat::RandomString
+ properties:
+ length: 4
+
+ my_keypair:
+ type: OS::Nova::KeyPair
+ properties:
+ name:
+ str_replace:
+ template: base_rand
+ params:
+ base: { get_param: key_name }
+ rand: { get_resource: random-str }
+ public_key: { get_param: pub_key }
+ save_private_key: false
+
+ vdns_0:
+ type: OS::Nova::Server
+ properties:
+ image: { get_param: vlb_image_name }
+ flavor: { get_param: vlb_flavor_name }
+ name: { get_param: vdns_name_0 }
+ key_name: { get_resource: my_keypair }
+ networks:
+ - network: { get_param: public_net_id }
+ - port: { get_resource: vdns_private_0_port }
+ - port: { get_resource: vdns_private_1_port }
+ metadata: {vnf_id: { get_param: vnf_id }, vf_module_id: { get_param: vf_module_id }}
+ user_data_format: RAW
+ user_data:
+ str_replace:
+ params:
+ __lb_oam_int__ : { get_param: vlb_private_ip_1 }
+ __lb_private_ipaddr__: { get_param: vlb_private_ip_0 }
+ __local_private_ipaddr__: { get_param: vdns_private_ip_0 }
+ __repo_url_blob__ : { get_param: repo_url_blob }
+ __repo_url_artifacts__ : { get_param: repo_url_artifacts }
+ __demo_artifacts_version__ : { get_param: demo_artifacts_version }
+ template: |
+ #!/bin/bash
+
+ LB_OAM_INT=__lb_oam_int__
+ LB_PRIVATE_IPADDR=__lb_private_ipaddr__
+ LOCAL_PRIVATE_IPADDR=__local_private_ipaddr__
+ REPO_URL_BLOB=__repo_url_blob__
+ REPO_URL_ARTIFACTS=__repo_url_artifacts__
+ DEMO_ARTIFACTS_VERSION=__demo_artifacts_version__
+
+ # Download required dependencies
+ add-apt-repository -y ppa:openjdk-r/ppa
+ apt-get update
+ apt-get install -y wget openjdk-8-jdk bind9 bind9utils bind9-doc apt-transport-https ca-certificates
+ apt-get install -y maven
+ sleep 1
+
+ # Download vDNS demo code for DNS Server
+ mkdir /opt/config
+ mkdir /opt/FDclient
+ cd /opt
+
+ wget $REPO_URL_BLOB/org.openecomp.demo/vnfs/vlb/$DEMO_ARTIFACTS_VERSION/v_dns_init.sh
+ wget $REPO_URL_BLOB/org.openecomp.demo/vnfs/vlb/$DEMO_ARTIFACTS_VERSION/vdns.sh
+ wget $REPO_URL_BLOB/org.openecomp.demo/vnfs/vlb/$DEMO_ARTIFACTS_VERSION/dnsclient.sh
+ wget $REPO_URL_BLOB/org.openecomp.demo/vnfs/vlb/$DEMO_ARTIFACTS_VERSION/set_gre_tunnel.sh
+
+ mvn org.apache.maven.plugins:maven-dependency-plugin:2.10:get -DremoteRepositories=$REPO_URL_ARTIFACTS -Dartifact=org.openecomp.demo.vnf.vlb:dns-client:$DEMO_ARTIFACTS_VERSION:jar -Dtransitive=false -Ddest=.
+
+ mv dns-client-$DEMO_ARTIFACTS_VERSION.jar /opt/FDclient/
+ mv dnsclient.sh /opt/FDclient/
+ mv set_gre_tunnel.sh /opt/FDclient/
+
+ chmod +x v_dns_init.sh
+ chmod +x vdns.sh
+ chmod +x /opt/FDclient/dnsclient.sh
+ chmod +x /opt/FDclient/set_gre_tunnel.sh
+
+ echo $LB_OAM_INT > config/lb_oam_int.txt
+ echo $LB_PRIVATE_IPADDR > config/lb_private_ipaddr.txt
+ echo $LOCAL_PRIVATE_IPADDR > config/local_private_ipaddr.txt
+ echo $DEMO_ARTIFACTS_VERSION > config/artifacts_version.txt
+
+ # Download Bind config files
+ cd /opt/config
+ wget $REPO_URL_BLOB/org.openecomp.demo/vnfs/vlb/$DEMO_ARTIFACTS_VERSION/db_dnsdemo_openecomp_org
+ wget $REPO_URL_BLOB/org.openecomp.demo/vnfs/vlb/$DEMO_ARTIFACTS_VERSION/named.conf.options
+ wget $REPO_URL_BLOB/org.openecomp.demo/vnfs/vlb/$DEMO_ARTIFACTS_VERSION/named.conf.local
+
+ # Configure Bind
+ modprobe ip_gre
+ mkdir /etc/bind/zones
+ sed -i "s/OPTIONS=.*/OPTIONS=\"-4 -u bind\"/g" /etc/default/bind9
+ mv db_dnsdemo_openecomp_org /etc/bind/zones/db.dnsdemo.openecomp.org
+ mv named.conf.options /etc/bind/
+ mv named.conf.local /etc/bind/
+ sleep 1
+
+ # Run instantiation script
+ cd /opt
+ mv vdns.sh /etc/init.d
+ update-rc.d vdns.sh defaults
+ ./v_dns_init.sh
+
+ vdns_private_0_port:
+ type: OS::Neutron::Port
+ properties:
+ network: { get_param: vlb_private_net_id }
+ fixed_ips: [{"subnet": { get_param: vlb_private_net_id }, "ip_address": { get_param: vdns_private_ip_0 }}]
+
+ vdns_private_1_port:
+ type: OS::Neutron::Port
+ properties:
+ network: { get_param: ecomp_private_net_id }
+ fixed_ips: [{"subnet": { get_param: ecomp_private_subnet_id }, "ip_address": { get_param: vdns_private_ip_1 }}]
diff --git a/kubernetes/config/docker/init/src/config/robot/robot/assets/asdc/base_vvg/MANIFEST.json b/kubernetes/config/docker/init/src/config/robot/robot/assets/asdc/base_vvg/MANIFEST.json
new file mode 100644
index 0000000000..67312f23b8
--- /dev/null
+++ b/kubernetes/config/docker/init/src/config/robot/robot/assets/asdc/base_vvg/MANIFEST.json
@@ -0,0 +1,17 @@
+{
+ "name": "volumeGroup.yaml",
+ "description": "robot ete manifest",
+ "data": [
+ {
+ "file": "base_vvg.yaml",
+ "type": "HEAT",
+ "isBase": "true",
+ "data": [
+ {
+ "file": "base_vvg.env",
+ "type": "HEAT_ENV"
+ }
+ ]
+ }
+ ]
+} \ No newline at end of file
diff --git a/kubernetes/config/docker/init/src/config/robot/robot/assets/asdc/base_vvg/base_vvg.env b/kubernetes/config/docker/init/src/config/robot/robot/assets/asdc/base_vvg/base_vvg.env
new file mode 100644
index 0000000000..2b4e72b833
--- /dev/null
+++ b/kubernetes/config/docker/init/src/config/robot/robot/assets/asdc/base_vvg/base_vvg.env
@@ -0,0 +1,3 @@
+parameters:
+ volume_size: 100
+ nova_instance: 1234456 \ No newline at end of file
diff --git a/kubernetes/config/docker/init/src/config/robot/robot/assets/asdc/base_vvg/base_vvg.yaml b/kubernetes/config/docker/init/src/config/robot/robot/assets/asdc/base_vvg/base_vvg.yaml
new file mode 100644
index 0000000000..c20d4e4850
--- /dev/null
+++ b/kubernetes/config/docker/init/src/config/robot/robot/assets/asdc/base_vvg/base_vvg.yaml
@@ -0,0 +1,22 @@
+heat_template_version: 2013-05-23
+description: create a Nova instance, a Cinder volume and attach the volume to the instance.
+
+parameters:
+ nova_instance:
+ type: string
+ label: Instance name or ID
+ description: ID of the vm to use for the disk to be attached too
+ volume_size:
+ type: number
+ label: GB
+ description: Size of the volume to be created.
+resources:
+ cinder_volume:
+ type: OS::Cinder::Volume
+ properties:
+ size: { get_param: volume_size }
+ volume_attachment:
+ type: OS::Cinder::VolumeAttachment
+ properties:
+ volume_id: { get_resource: cinder_volume }
+ instance_uuid: { get_param: nova_instance } \ No newline at end of file
diff --git a/kubernetes/config/docker/init/src/config/robot/robot/assets/dcae/dcae_healthcheck.json b/kubernetes/config/docker/init/src/config/robot/robot/assets/dcae/dcae_healthcheck.json
new file mode 100644
index 0000000000..d612b08210
--- /dev/null
+++ b/kubernetes/config/docker/init/src/config/robot/robot/assets/dcae/dcae_healthcheck.json
@@ -0,0 +1,5 @@
+{
+ "path": "/reports/dcae/service-instances",
+ "start": "-24hour",
+ "end": "now"
+} \ No newline at end of file
diff --git a/kubernetes/config/docker/init/src/config/robot/robot/assets/keys/ecompdemo.pvt b/kubernetes/config/docker/init/src/config/robot/robot/assets/keys/ecompdemo.pvt
new file mode 100644
index 0000000000..36d9e9cf39
--- /dev/null
+++ b/kubernetes/config/docker/init/src/config/robot/robot/assets/keys/ecompdemo.pvt
@@ -0,0 +1,30 @@
+-----BEGIN RSA PRIVATE KEY-----
+Proc-Type: 4,ENCRYPTED
+DEK-Info: DES-EDE3-CBC,E9DC8BE477D6D4AC
+
+4lYXpDswDU9oNh/OdB/0krK7AVN2OYnU98ZvYUfQIVWgrAty0vp0PDErOAAP7AOE
+tz+tQwvg/JVqZlBGCYIkwx5ADJ9YFXMyn/Ztla2jC90dxbjlra+MvuU9nMfjWhjP
+PiaOysIDaRIPZqjkjRQcslgsDYgVF4JC+2qRMJ62e5exk0dw4Cn3XeN53pByQ8HT
+OnTuszejFNb3/HA5LsPyJl3cZqMBlKOHToUBbF2JBuo+aDq5S+YgzILep/nTQadh
+kLfuJThhAwTJsQWVCSOggAwsjV6fP5yi2q9iCmF07kxDgRsByj0nl/7YDoZ69ZoE
+LHkZEoZ1JSX0SSOrOUyVcpf8+ofK1aMEoWRvLGYfBD7wDJb4nzi4k1fdJGnoDLms
+dr+mL7RB5zoC3xlumSAK2AP8hhIfURtaSC9hpiUB6yIXCmUjx4FIzroa4gBUsrlJ
+R6KGp+6b54bf7hwFeCjYENjGq5YJJ24Aur2mR045LCBNP452pFVi5SIfX0PO5ocd
+dBvPHQUqtCoUkQMSTtjy6T384BbPeA5s5zazq7WUoNrQD37khR7MojBpww0s3wEh
+U+XWlQ5bEjEjac5Q8RIJrB2Bp6/cUQFSlqNDKxK2y1WzvPjM/Fkn2H+hImn+we7n
+Cp5fzx6s4roeEc9WvVmb2+V3xV883pkktd1IiWGfleB14ZJ1vcGzdW+lBINgm9h1
+5xvxP5Xtqj8KGGoA3mEo3CbzR1XbkEp7/S4MN1OsXSCy3jZpiP+ctd4fwk5Ltcqz
+YEjM5cb2+joNYTd4JW5DTtz7qrMn/sotAOlgw2ozmXLfbbMuOZ9SX76npEr8SKd+
+065bxJ+YvN6MFzwG75nFfXcPWdNVntXaH+zOZfBGBNX84gX4p3ORF1u18brNcd9z
+0sv1OiGdO5NFVA/3YixP1P2zZxlGsi972PtHoQ8SHxbEfNMCqkNGrHh+KmaT42k6
+W5lscEhPDtIsiRmhTTrL6L5sFCbLL+8UZktK1/TU27QtCtywi5xfzO9NhJg27R5b
+hPvQs43V7KItpdc5LdWrft7hTnmc4jn5F6aE7l9bCaaRgAy1MH6lzyjuaLphFXmP
+GdPLD9GhMFiTRJNVCRkYPZwtGKdfG6/z6kRZGIi6XPYzI3FcHOdKTGgvGxlko6Lr
+4FG0kOwgi55o1gQnL3wsBVoNZ7PrkHLFSQhu03ggXPrf75oMN0Tsqai+iaf4OvMr
+fgk4O5+D/CX94R50V1xUymUrRIAzKG3k+jebFcTzkb7B/e1bPwr8ZRUk31nZrgYp
+3qKJT77/Vz+tyL3H+U3YdvzxhG6+onXDkAvO8WAcfsKpEJ3thv8NOqXZeKCY2m1G
+wrQ8vfl6MddOvlI5EKbnwesXIznO9Gl+RoCm18I/M8bETTAOMJXb3cp4GiBffXbI
+8kbYwVeHGscXizHdkuqjbN1NLg5KPZV10KRchg0g85PWgDr59wY5kMplFNUrkxY2
+1ETYOZsmOa3/Afcq2dgxEw1t1t+ZRR5dh6OdQXKCvsHHugQisnPi5NAb8gkZbRJI
+yHNInMegrG2S17n75P0o+GM+XItc74ygnv/KedJFW9uBaOr7sXtB4A==
+-----END RSA PRIVATE KEY-----
diff --git a/kubernetes/config/docker/init/src/config/robot/robot/assets/keys/robot_ssh_private_key.ppk b/kubernetes/config/docker/init/src/config/robot/robot/assets/keys/robot_ssh_private_key.ppk
new file mode 100644
index 0000000000..0a327c24f6
--- /dev/null
+++ b/kubernetes/config/docker/init/src/config/robot/robot/assets/keys/robot_ssh_private_key.ppk
@@ -0,0 +1,26 @@
+PuTTY-User-Key-File-2: ssh-rsa
+Encryption: none
+Comment: rsa-key-20161026
+Public-Lines: 6
+AAAAB3NzaC1yc2EAAAABJQAAAQEAqqnA9BAiMLtjOPSYBfhzLu4CiBolWoskDg4K
+VwhTJVTTeB6CqrQNcadlGXxOHhCYuNCKkUmIVF4WTOisVOJ75Z1c4OMoZLL85xVP
+KSIeH63kgVugwgPYQu55NbbWX+rsbUha3LnElDhNviMM3iTPbD5nnhKixNERAJMT
+LKXvZZZGqxW94bREknYPQTT2qrk3YRqwldncopp6Nkgv3AnSJz2gc9tjxnWF0poT
+QnQm/3D6hiJICrzKfAV0EaPN0KdtYjPhKrYoy6Qb/tKOVaaqsvwfKBJGrT9LfcA7
+D7M/yj292RT1XN63hI84WC383LsaPJ6eWdDTE6zUP1eGTWCoOw==
+Private-Lines: 14
+AAABAGoWftznbzMMs0zrEmSThd7m+qehjNdrP+0PpZAMGAJy//6PgahiFjHkmMqn
+N3p5BP1DXQ40oNp/rP9gM8YQPy3eXFRxh8/k4mYiAMaK1HSOsKNwTyx+7jdxpUrn
+Rv1arqTMHM5lo7YVKWha+ik5egUEMpKxo3NtNBUdJ5hLeSN4EzbS0xq6dYA0EU33
+kjmkoqtj2qMhwZQmTUCyqvtae6t9I7YTP9DbkG+kyuWSLCrbIFN3SPU7jsLBxI45
+cdUiAKBbd6WjPYauSyhTenZvqjxDV0w/QUPKv3vxpqPvLfdA/gQfvhFLkNMStdb9
+DKB4ni8uiAPtM5AVYlgEpC7Nuw0AAACBANa5Wi9KvsPp5ltbiwrLeoVTPmFwAhJP
+w+B+OEoRN4oMqstIBOZiYz1+WV/nA3WR1gOd/TbDL4kzXL9SYl/y8QmFjrc7B4vI
+GLhWnDBjl1l/wvYhxMXbfHEN2VqZVICSoEVICphx6SPflFH53kmGrIiBs9GWFv9c
+AVGHi1j52rvRAAAAgQDLeCWfKS24gUcSfn/UHlc9EGgyNayeC3eX4K2xV9yMSXub
+uQVvxiuBXd6OWW9I/CQyNVoLN3tboAzRl61ds15Ml+V/uLMjxrXJXDWkEiQHsOMX
+BhREWZL0T3hlFZsyfVZPPH5BavZzA4PB1/BF+t06N10pnASXB4kcKjQD0JQCSwAA
+AIBfQ7PZM1KuL0zpD6imxUgyNNSXdGTfM9XUSY5L8e2xWqjnZT+Cj1bUGVYMxrpC
+8bpfGGTyBv/v6N7NxPep1QeyM9E0o0z0ID9ybRpX4ErYSp1sLZBNlBXdAAL9nexo
+XbZDpN0zdBE5wnAMjcjHTp9PMSDeWt4/r2aiNde3VFwnWg==
+Private-MAC: 50d4bf08bffb34c3aba06d57afb241242ca9e242
diff --git a/kubernetes/config/docker/init/src/config/robot/robot/assets/keys/robot_ssh_private_key.pvt b/kubernetes/config/docker/init/src/config/robot/robot/assets/keys/robot_ssh_private_key.pvt
new file mode 100644
index 0000000000..17c17a3dca
--- /dev/null
+++ b/kubernetes/config/docker/init/src/config/robot/robot/assets/keys/robot_ssh_private_key.pvt
@@ -0,0 +1,27 @@
+-----BEGIN RSA PRIVATE KEY-----
+MIIEoQIBAAKCAQEAqqnA9BAiMLtjOPSYBfhzLu4CiBolWoskDg4KVwhTJVTTeB6C
+qrQNcadlGXxOHhCYuNCKkUmIVF4WTOisVOJ75Z1c4OMoZLL85xVPKSIeH63kgVug
+wgPYQu55NbbWX+rsbUha3LnElDhNviMM3iTPbD5nnhKixNERAJMTLKXvZZZGqxW9
+4bREknYPQTT2qrk3YRqwldncopp6Nkgv3AnSJz2gc9tjxnWF0poTQnQm/3D6hiJI
+CrzKfAV0EaPN0KdtYjPhKrYoy6Qb/tKOVaaqsvwfKBJGrT9LfcA7D7M/yj292RT1
+XN63hI84WC383LsaPJ6eWdDTE6zUP1eGTWCoOwIBJQKCAQBqFn7c528zDLNM6xJk
+k4Xe5vqnoYzXaz/tD6WQDBgCcv/+j4GoYhYx5JjKpzd6eQT9Q10ONKDaf6z/YDPG
+ED8t3lxUcYfP5OJmIgDGitR0jrCjcE8sfu43caVK50b9Wq6kzBzOZaO2FSloWvop
+OXoFBDKSsaNzbTQVHSeYS3kjeBM20tMaunWANBFN95I5pKKrY9qjIcGUJk1Asqr7
+WnurfSO2Ez/Q25BvpMrlkiwq2yBTd0j1O47CwcSOOXHVIgCgW3eloz2GrksoU3p2
+b6o8Q1dMP0FDyr978aaj7y33QP4EH74RS5DTErXW/QygeJ4vLogD7TOQFWJYBKQu
+zbsNAoGBANa5Wi9KvsPp5ltbiwrLeoVTPmFwAhJPw+B+OEoRN4oMqstIBOZiYz1+
+WV/nA3WR1gOd/TbDL4kzXL9SYl/y8QmFjrc7B4vIGLhWnDBjl1l/wvYhxMXbfHEN
+2VqZVICSoEVICphx6SPflFH53kmGrIiBs9GWFv9cAVGHi1j52rvRAoGBAMt4JZ8p
+LbiBRxJ+f9QeVz0QaDI1rJ4Ld5fgrbFX3IxJe5u5BW/GK4Fd3o5Zb0j8JDI1Wgs3
+e1ugDNGXrV2zXkyX5X+4syPGtclcNaQSJAew4xcGFERZkvRPeGUVmzJ9Vk88fkFq
+9nMDg8HX8EX63To3XSmcBJcHiRwqNAPQlAJLAoGAdBEp1F/BD/QN0ISCgmAmjUHA
+2rkV4GJ3t54sQ7ZHiORApTuvnyBs/qUpZEWFVE7UjFVmRx1lzZ85DXij4NZYxuBo
+0b8K/3MUR/d3BWZD+QbKP9rm532PX7R1fRScYSypqOiryAY41R7oY6molnJPbGHI
++6sTWZmELBHqdUjJQu0CgYEAuvjIoBgAgAgXy84wRmER5RX+4gfPDcVZI8eK2lC8
+0/B/bICBiU5RfcvhRImI20iP9sk9/HgsKq6/q9d8tvfaHN6bih9Ygb2Ec9gxSqji
+1qKLfPDUWnvTJbDPf3ujXtQKH0xYV8oS5jqUv/bcyq8sJ6h/H1EY+XyL1LEo4Oku
+D/ECgYBfQ7PZM1KuL0zpD6imxUgyNNSXdGTfM9XUSY5L8e2xWqjnZT+Cj1bUGVYM
+xrpC8bpfGGTyBv/v6N7NxPep1QeyM9E0o0z0ID9ybRpX4ErYSp1sLZBNlBXdAAL9
+nexoXbZDpN0zdBE5wnAMjcjHTp9PMSDeWt4/r2aiNde3VFwnWg==
+-----END RSA PRIVATE KEY-----
diff --git a/kubernetes/config/docker/init/src/config/robot/robot/assets/keys/robot_ssh_public_key.pub b/kubernetes/config/docker/init/src/config/robot/robot/assets/keys/robot_ssh_public_key.pub
new file mode 100644
index 0000000000..934c60a825
--- /dev/null
+++ b/kubernetes/config/docker/init/src/config/robot/robot/assets/keys/robot_ssh_public_key.pub
@@ -0,0 +1,9 @@
+---- BEGIN SSH2 PUBLIC KEY ----
+Comment: "rsa-key-20161026"
+AAAAB3NzaC1yc2EAAAABJQAAAQEAqqnA9BAiMLtjOPSYBfhzLu4CiBolWoskDg4K
+VwhTJVTTeB6CqrQNcadlGXxOHhCYuNCKkUmIVF4WTOisVOJ75Z1c4OMoZLL85xVP
+KSIeH63kgVugwgPYQu55NbbWX+rsbUha3LnElDhNviMM3iTPbD5nnhKixNERAJMT
+LKXvZZZGqxW94bREknYPQTT2qrk3YRqwldncopp6Nkgv3AnSJz2gc9tjxnWF0poT
+QnQm/3D6hiJICrzKfAV0EaPN0KdtYjPhKrYoy6Qb/tKOVaaqsvwfKBJGrT9LfcA7
+D7M/yj292RT1XN63hI84WC383LsaPJ6eWdDTE6zUP1eGTWCoOw==
+---- END SSH2 PUBLIC KEY ----
diff --git a/kubernetes/config/docker/init/src/config/robot/robot/assets/keys/robot_ssh_public_key.txt b/kubernetes/config/docker/init/src/config/robot/robot/assets/keys/robot_ssh_public_key.txt
new file mode 100644
index 0000000000..43a61cd900
--- /dev/null
+++ b/kubernetes/config/docker/init/src/config/robot/robot/assets/keys/robot_ssh_public_key.txt
@@ -0,0 +1 @@
+ssh-rsa AAAAB3NzaC1yc2EAAAABJQAAAQEAqqnA9BAiMLtjOPSYBfhzLu4CiBolWoskDg4KVwhTJVTTeB6CqrQNcadlGXxOHhCYuNCKkUmIVF4WTOisVOJ75Z1c4OMoZLL85xVPKSIeH63kgVugwgPYQu55NbbWX+rsbUha3LnElDhNviMM3iTPbD5nnhKixNERAJMTLKXvZZZGqxW94bREknYPQTT2qrk3YRqwldncopp6Nkgv3AnSJz2gc9tjxnWF0poTQnQm/3D6hiJICrzKfAV0EaPN0KdtYjPhKrYoy6Qb/tKOVaaqsvwfKBJGrT9LfcA7D7M/yj292RT1XN63hI84WC383LsaPJ6eWdDTE6zUP1eGTWCoOw== rsa-key-20161026 \ No newline at end of file
diff --git a/kubernetes/config/docker/init/src/config/robot/robot/assets/service_mappings.py b/kubernetes/config/docker/init/src/config/robot/robot/assets/service_mappings.py
new file mode 100644
index 0000000000..0465c68885
--- /dev/null
+++ b/kubernetes/config/docker/init/src/config/robot/robot/assets/service_mappings.py
@@ -0,0 +1,29 @@
+GLOBAL_SERVICE_FOLDER_MAPPING = {"vFW" : ['base_vfw'], \
+ "vLB" : ['base_vlb'], \
+ "vVG" : ['base_vvg'], \
+ }
+
+GLOBAL_SERVICE_TEMPLATE_MAPPING = {"vFW" : [{"isBase" : "true", "template" : "vfw_preload.template", "name_pattern": "base_vfw"}], \
+ "vLB" : [{"isBase" : "true", "template" : "vlb_preload.template", "name_pattern": "base_vlb"},
+ {"isBase" : "false", "template" : "dnsscaling_preload.template", "name_pattern": "dnsscaling", "prefix" : "vDNS_"}],
+ "vVG" : [{"isBase" : "true", "template" : "vvg_preload.template", "name_pattern": "base_vvg"}], \
+ }
+
+
+##
+## The following identifies the stack parameter names for the onap_oam network IPS
+## In stantiated by the stack. During stack teardown, we need to ensure that
+## These ports are deleted due to latency in rackspace to free these ports.
+## This is just a workaround to enable respinning a VM as soon as possible
+GLOBAL_SERVICE_ECOMP_IP_MAPPING = {"vFW" : ['vpg_private_ip_1', 'vfw_private_ip_2','vsn_private_ip_1'], \
+ "vLB" : ['vlb_private_ip_1', 'vdns_private_ip_1'],
+ "vVG" : [], \
+ }
+
+
+##
+## Used by the Heatbridge Validate Query to A&AI to locate the vserver name
+GLOBAL_VALIDATE_NAME_MAPPING = {"vFW" : 'vfw_name_0',
+ "vLB" : 'vlb_name_0',
+ "vVG" : ''
+ }
diff --git a/kubernetes/config/docker/init/src/config/robot/robot/assets/templates/aai/add_customer.template b/kubernetes/config/docker/init/src/config/robot/robot/assets/templates/aai/add_customer.template
new file mode 100644
index 0000000000..d0ae174adc
--- /dev/null
+++ b/kubernetes/config/docker/init/src/config/robot/robot/assets/templates/aai/add_customer.template
@@ -0,0 +1,25 @@
+{
+ "global-customer-id": "${global_customer_id}",
+ "subscriber-name": "${subscriber_name}",
+ "subscriber-type": "${subscriber_type}",
+ "service-subscriptions": {
+ "service-subscription": [{
+ "service-type": "${service1}",
+ "relationship-list": {
+ "relationship": [{
+ "related-to": "tenant",
+ "relationship-data": [{
+ "relationship-key": "cloud-region.cloud-owner",
+ "relationship-value": "${cloud_owner1}"
+ }, {
+ "relationship-key": "cloud-region.cloud-region-id",
+ "relationship-value": "${cloud_region_id1}"
+ }, {
+ "relationship-key": "tenant.tenant-id",
+ "relationship-value": "${tenant_id1}"
+ }]
+ }]
+ }
+ }]
+ }
+ } \ No newline at end of file
diff --git a/kubernetes/config/docker/init/src/config/robot/robot/assets/templates/aai/add_demo_customer.template b/kubernetes/config/docker/init/src/config/robot/robot/assets/templates/aai/add_demo_customer.template
new file mode 100644
index 0000000000..e56577c54b
--- /dev/null
+++ b/kubernetes/config/docker/init/src/config/robot/robot/assets/templates/aai/add_demo_customer.template
@@ -0,0 +1,47 @@
+{
+ "global-customer-id" : "${global_customer_id}",
+ "subscriber-name" : "${subscriber_name}",
+ "subscriber-type" : "${subscriber_type}",
+ "service-subscriptions" : {
+ "service-subscription" : [{
+ "service-type" : "${service1}",
+ "relationship-list" : {
+ "relationship" : [{
+ "related-to" : "tenant",
+ "relationship-data" : [{
+ "relationship-key" : "cloud-region.cloud-owner",
+ "relationship-value" : "${cloud_owner}"
+ }, {
+ "relationship-key" : "cloud-region.cloud-region-id",
+ "relationship-value" : "${cloud_region_id}"
+ }, {
+ "relationship-key" : "tenant.tenant-id",
+ "relationship-value" : "${tenant_id}"
+ }
+ ]
+ }
+ ]
+ }
+ }, {
+ "service-type" : "${service2}",
+ "relationship-list" : {
+ "relationship" : [{
+ "related-to" : "tenant",
+ "relationship-data" : [{
+ "relationship-key" : "cloud-region.cloud-owner",
+ "relationship-value" : "${cloud_owner}"
+ }, {
+ "relationship-key" : "cloud-region.cloud-region-id",
+ "relationship-value" : "${cloud_region_id}"
+ }, {
+ "relationship-key" : "tenant.tenant-id",
+ "relationship-value" : "${tenant_id}"
+ }
+ ]
+ }
+ ]
+ }
+ }
+ ]
+ }
+}
diff --git a/kubernetes/config/docker/init/src/config/robot/robot/assets/templates/aai/add_service_body.template b/kubernetes/config/docker/init/src/config/robot/robot/assets/templates/aai/add_service_body.template
new file mode 100644
index 0000000000..ca32fd5146
--- /dev/null
+++ b/kubernetes/config/docker/init/src/config/robot/robot/assets/templates/aai/add_service_body.template
@@ -0,0 +1,6 @@
+{
+ "service-id": "${UUID}",
+ "service-description": "${service_type}"
+}
+
+
diff --git a/kubernetes/config/docker/init/src/config/robot/robot/assets/templates/aai/add_tenant_body.template b/kubernetes/config/docker/init/src/config/robot/robot/assets/templates/aai/add_tenant_body.template
new file mode 100644
index 0000000000..a7dbbbf72f
--- /dev/null
+++ b/kubernetes/config/docker/init/src/config/robot/robot/assets/templates/aai/add_tenant_body.template
@@ -0,0 +1,18 @@
+{
+ "cloud-owner": "${cloud_owner}",
+ "cloud-region-id": "${cloud_region_id}",
+ "cloud-type": "${cloud_type}",
+ "owner-defined-type": "${owner_defined_type}",
+ "cloud-region-version": "${cloud_region_version}",
+ "cloud-zone": "${cloud_zone}",
+ ${resource_version}
+ "tenants": {
+ "tenant": [{
+ "tenant-id": "${tenant_id}",
+ "tenant-name": "${tenant_name}"
+
+ }]
+ }
+}
+
+
diff --git a/kubernetes/config/docker/init/src/config/robot/robot/assets/templates/aai/named_query.template b/kubernetes/config/docker/init/src/config/robot/robot/assets/templates/aai/named_query.template
new file mode 100644
index 0000000000..de3f21f683
--- /dev/null
+++ b/kubernetes/config/docker/init/src/config/robot/robot/assets/templates/aai/named_query.template
@@ -0,0 +1,17 @@
+{
+ "query-parameters": {
+ "named-query": {
+ "named-query-uuid": "f199cb88-5e69-4b1f-93e0-6f257877d066"
+ }
+ },
+ "instance-filters": {
+ "instance-filter": [
+ {
+ "vserver":
+ {
+ "vserver-name": "${vserver_name}"
+ }
+ }
+ ]
+ }
+} \ No newline at end of file
diff --git a/kubernetes/config/docker/init/src/config/robot/robot/assets/templates/aai/service_subscription.template b/kubernetes/config/docker/init/src/config/robot/robot/assets/templates/aai/service_subscription.template
new file mode 100644
index 0000000000..85703581e3
--- /dev/null
+++ b/kubernetes/config/docker/init/src/config/robot/robot/assets/templates/aai/service_subscription.template
@@ -0,0 +1,19 @@
+{
+ "service-subscription":[
+ {
+ "service-type":"{$service_type}",
+ "resource-version":"1473866861",
+ "service-instances":{
+ "service-instance":[
+ {
+ "service-instance-id":"d3f9a631-e280-4a87-846d-9ccd7a265980",
+ "service-instance-name":"VIV+IST+ezNew+Oct6",
+ "persona-model-id":"e6f1d393-6432-4820-ab86-7a10ba4b31ac",
+ "persona-model-version":"1.0",
+ "resource-version":"1475807447"
+ }
+ ]
+ }
+ }
+ ]
+} \ No newline at end of file
diff --git a/kubernetes/config/docker/init/src/config/robot/robot/assets/templates/aai/vlb_closed_loop_hack.template b/kubernetes/config/docker/init/src/config/robot/robot/assets/templates/aai/vlb_closed_loop_hack.template
new file mode 100644
index 0000000000..27f9c963b8
--- /dev/null
+++ b/kubernetes/config/docker/init/src/config/robot/robot/assets/templates/aai/vlb_closed_loop_hack.template
@@ -0,0 +1,7 @@
+{
+ "is-base-vf-module": false,
+ "persona-model-id": "${persona_model_id}",
+ "persona-model-version": "1.0",
+ "vf-module-id": "${vf_module_id}",
+ "vf-module-name": "${vf_module_id}"
+}
diff --git a/kubernetes/config/docker/init/src/config/robot/robot/assets/templates/appc/vnf_mount.template b/kubernetes/config/docker/init/src/config/robot/robot/assets/templates/appc/vnf_mount.template
new file mode 100644
index 0000000000..8ad11359a0
--- /dev/null
+++ b/kubernetes/config/docker/init/src/config/robot/robot/assets/templates/appc/vnf_mount.template
@@ -0,0 +1,16 @@
+<node xmlns="urn:TBD:params:xml:ns:yang:network-topology">
+ <node-id>${nodeid}</node-id>
+ <host xmlns="urn:opendaylight:netconf-node-topology">${host}</host>
+ <port xmlns="urn:opendaylight:netconf-node-topology">${port}</port>
+ <username xmlns="urn:opendaylight:netconf-node-topology">${username}</username>
+ <password xmlns="urn:opendaylight:netconf-node-topology">${password}</password>
+ <tcp-only xmlns="urn:opendaylight:netconf-node-topology">false</tcp-only>
+ <!-- non-mandatory fields with default values, you can safely remove these if you do not wish to override any of these values-->
+ <reconnect-on-changed-schema xmlns="urn:opendaylight:netconf-node-topology">false</reconnect-on-changed-schema>
+ <connection-timeout-millis xmlns="urn:opendaylight:netconf-node-topology">20000</connection-timeout-millis>
+ <max-connection-attempts xmlns="urn:opendaylight:netconf-node-topology">0</max-connection-attempts>
+ <between-attempts-timeout-millis xmlns="urn:opendaylight:netconf-node-topology">2000</between-attempts-timeout-millis>
+ <sleep-factor xmlns="urn:opendaylight:netconf-node-topology">1.5</sleep-factor>
+ <!-- keepalive-delay set to 0 turns off keepalives-->
+ <keepalive-delay xmlns="urn:opendaylight:netconf-node-topology">120</keepalive-delay>
+</node> \ No newline at end of file
diff --git a/kubernetes/config/docker/init/src/config/robot/robot/assets/templates/asdc/action.template b/kubernetes/config/docker/init/src/config/robot/robot/assets/templates/asdc/action.template
new file mode 100644
index 0000000000..4d417c9f56
--- /dev/null
+++ b/kubernetes/config/docker/init/src/config/robot/robot/assets/templates/asdc/action.template
@@ -0,0 +1,3 @@
+{
+ "action": "${action}"
+} \ No newline at end of file
diff --git a/kubernetes/config/docker/init/src/config/robot/robot/assets/templates/asdc/catalog_resource.template b/kubernetes/config/docker/init/src/config/robot/robot/assets/templates/asdc/catalog_resource.template
new file mode 100644
index 0000000000..fcc17ce2a6
--- /dev/null
+++ b/kubernetes/config/docker/init/src/config/robot/robot/assets/templates/asdc/catalog_resource.template
@@ -0,0 +1,43 @@
+{
+ "artifacts": {},
+ "toscaArtifacts": {},
+ "contactId": "cs0008",
+ "categories": [
+ {
+ "name": "Generic",
+ "normalizedName": "generic",
+ "uniqueId": "resourceNewCategory.generic",
+ "subcategories": [
+ {
+ "name": "Abstract",
+ "normalizedName": "abstract",
+ "uniqueId": "resourceNewCategory.generic.abstract",
+ "icons": [
+ "database"
+ ]
+ }
+ ]
+ }
+ ],
+ "description": "vendor software product",
+ "icon": "defaulticon",
+ "componentInstancesProperties": {},
+ "componentInstancesAttributes": {},
+ "name": "${software_product_name}",
+ "tags": [
+ "${software_product_name}"
+ ],
+ "capabilities": {},
+ "requirements": {},
+ "deploymentArtifacts": {},
+ "componentType": "RESOURCE",
+ "vendorName": "${vendor_name}",
+ "vendorRelease": "1.0",
+ "componentInstances": [],
+ "properties": [],
+ "attributes": [],
+ "groups": [],
+ "resourceType": "VF",
+ "csarUUID": "${software_product_id}",
+ "csarVersion": "1.0"
+} \ No newline at end of file
diff --git a/kubernetes/config/docker/init/src/config/robot/robot/assets/templates/asdc/catalog_service.template b/kubernetes/config/docker/init/src/config/robot/robot/assets/templates/asdc/catalog_service.template
new file mode 100644
index 0000000000..e7ffdea681
--- /dev/null
+++ b/kubernetes/config/docker/init/src/config/robot/robot/assets/templates/asdc/catalog_service.template
@@ -0,0 +1,34 @@
+{
+ "artifacts": {},
+ "toscaArtifacts": {},
+ "contactId": "cs0008",
+ "categories": [
+ {
+ "name": "Network L1-3",
+ "normalizedName": "network l1-3",
+ "uniqueId": "serviceNewCategory.network l1-3",
+ "icons": [
+ "network_l_1-3"
+ ]
+ }
+ ],
+ "description": "catalog service description",
+ "icon": "network_l_1-3",
+ "componentInstancesProperties": {},
+ "componentInstancesAttributes": {},
+ "name": "${service_name}",
+ "tags": [
+ "robot-ete",
+ "${service_name}"
+ ],
+ "capabilities": {},
+ "requirements": {},
+ "deploymentArtifacts": {},
+ "componentType": "SERVICE",
+ "projectCode": "123456",
+ "componentInstances": [],
+ "properties": [],
+ "attributes": [],
+ "groups": [],
+ "serviceApiArtifacts": {}
+} \ No newline at end of file
diff --git a/kubernetes/config/docker/init/src/config/robot/robot/assets/templates/asdc/entitlement_pool.template b/kubernetes/config/docker/init/src/config/robot/robot/assets/templates/asdc/entitlement_pool.template
new file mode 100644
index 0000000000..bcb04d2f71
--- /dev/null
+++ b/kubernetes/config/docker/init/src/config/robot/robot/assets/templates/asdc/entitlement_pool.template
@@ -0,0 +1,26 @@
+{
+ "name": "${entitlement_pool_name}",
+ "description": "vendor entitlement pool",
+ "thresholdValue": "99",
+ "thresholdUnits": "Absolute",
+ "entitlementMetric": {
+ "choice": "CPU",
+ "other": ""
+ },
+ "increments": "robot",
+ "aggregationFunction": {
+ "choice": "Peak",
+ "other": ""
+ },
+ "operationalScope": {
+ "choices": [
+ "Availability_Zone"
+ ],
+ "other": ""
+ },
+ "time": {
+ "choice": "Hour",
+ "other": ""
+ },
+ "manufacturerReferenceNumber": "robot12345"
+} \ No newline at end of file
diff --git a/kubernetes/config/docker/init/src/config/robot/robot/assets/templates/asdc/feature_group.template b/kubernetes/config/docker/init/src/config/robot/robot/assets/templates/asdc/feature_group.template
new file mode 100644
index 0000000000..3d87b04737
--- /dev/null
+++ b/kubernetes/config/docker/init/src/config/robot/robot/assets/templates/asdc/feature_group.template
@@ -0,0 +1,11 @@
+{
+ "name": "${feature_group_name}",
+ "description": "vendor feature group",
+ "partNumber": "123abc456",
+ "addedLicenseKeyGroupsIds": [
+ "${key_group_id}"
+ ],
+ "addedEntitlementPoolsIds": [
+ "${entitlement_pool_id}"
+ ]
+} \ No newline at end of file
diff --git a/kubernetes/config/docker/init/src/config/robot/robot/assets/templates/asdc/key_group.template b/kubernetes/config/docker/init/src/config/robot/robot/assets/templates/asdc/key_group.template
new file mode 100644
index 0000000000..2081261bcd
--- /dev/null
+++ b/kubernetes/config/docker/init/src/config/robot/robot/assets/templates/asdc/key_group.template
@@ -0,0 +1,11 @@
+{
+ "name": "${key_group_name}",
+ "description": "vendor license key group",
+ "operationalScope": {
+ "choices": [
+ "Tenant"
+ ],
+ "other": ""
+ },
+ "type": "Universal"
+} \ No newline at end of file
diff --git a/kubernetes/config/docker/init/src/config/robot/robot/assets/templates/asdc/license_agreement.template b/kubernetes/config/docker/init/src/config/robot/robot/assets/templates/asdc/license_agreement.template
new file mode 100644
index 0000000000..6324d14022
--- /dev/null
+++ b/kubernetes/config/docker/init/src/config/robot/robot/assets/templates/asdc/license_agreement.template
@@ -0,0 +1,12 @@
+{
+ "name": "${license_agreement_name}",
+ "description": "vendor license agreement",
+ "requirementsAndConstrains": "abcdef",
+ "licenseTerm": {
+ "choice": "Fixed_Term",
+ "other": ""
+ },
+ "addedFeatureGroupsIds": [
+ "${feature_group_id}"
+ ]
+} \ No newline at end of file
diff --git a/kubernetes/config/docker/init/src/config/robot/robot/assets/templates/asdc/license_model.template b/kubernetes/config/docker/init/src/config/robot/robot/assets/templates/asdc/license_model.template
new file mode 100644
index 0000000000..45fc83fcb7
--- /dev/null
+++ b/kubernetes/config/docker/init/src/config/robot/robot/assets/templates/asdc/license_model.template
@@ -0,0 +1,5 @@
+{
+ "vendorName": "${vendor_name}",
+ "description": "vendor license model",
+ "iconRef": "icon"
+} \ No newline at end of file
diff --git a/kubernetes/config/docker/init/src/config/robot/robot/assets/templates/asdc/resource_instance.template b/kubernetes/config/docker/init/src/config/robot/robot/assets/templates/asdc/resource_instance.template
new file mode 100644
index 0000000000..215f8282d4
--- /dev/null
+++ b/kubernetes/config/docker/init/src/config/robot/robot/assets/templates/asdc/resource_instance.template
@@ -0,0 +1,10 @@
+{
+ "uniqueId": "${catalog_resource_id}${milli_timestamp}",
+ "posX": 406,
+ "posY": 248,
+ "name": "${catalog_resource_name}",
+ "componentVersion": "1.0",
+ "originType": "VF",
+ "icon": "defaulticon",
+ "componentUid": "${catalog_resource_id}"
+} \ No newline at end of file
diff --git a/kubernetes/config/docker/init/src/config/robot/robot/assets/templates/asdc/software_product.template b/kubernetes/config/docker/init/src/config/robot/robot/assets/templates/asdc/software_product.template
new file mode 100644
index 0000000000..f8a47521ba
--- /dev/null
+++ b/kubernetes/config/docker/init/src/config/robot/robot/assets/templates/asdc/software_product.template
@@ -0,0 +1,16 @@
+{
+ "name": "${software_product_name}",
+ "description": "vendor software product",
+ "category": "resourceNewCategory.generic",
+ "subCategory": "resourceNewCategory.generic.abstract",
+ "licensingVersion": "1.0",
+ "vendorName": "${vendor_name}",
+ "vendorId": "${vendor_id}",
+ "icon": "icon",
+ "licensingData": {
+ "licenseAgreement": "${license_agreement_id}",
+ "featureGroups": [
+ "${feature_group_id}"
+ ]
+ }
+} \ No newline at end of file
diff --git a/kubernetes/config/docker/init/src/config/robot/robot/assets/templates/asdc/user_remarks.template b/kubernetes/config/docker/init/src/config/robot/robot/assets/templates/asdc/user_remarks.template
new file mode 100644
index 0000000000..465115e6d9
--- /dev/null
+++ b/kubernetes/config/docker/init/src/config/robot/robot/assets/templates/asdc/user_remarks.template
@@ -0,0 +1 @@
+{"userRemarks":"${user_remarks}"} \ No newline at end of file
diff --git a/kubernetes/config/docker/init/src/config/robot/robot/assets/templates/cinder_add_volume.template b/kubernetes/config/docker/init/src/config/robot/robot/assets/templates/cinder_add_volume.template
new file mode 100644
index 0000000000..544f41e3bf
--- /dev/null
+++ b/kubernetes/config/docker/init/src/config/robot/robot/assets/templates/cinder_add_volume.template
@@ -0,0 +1,9 @@
+{
+ "volume": {
+ "display_name": "${name}",
+ "display_description": "${description}",
+ "size": ${size},
+ "volume_type": "${type}",
+ "availability_zone": "${availability_zone}"
+ }
+} \ No newline at end of file
diff --git a/kubernetes/config/docker/init/src/config/robot/robot/assets/templates/heat_add_stack.template b/kubernetes/config/docker/init/src/config/robot/robot/assets/templates/heat_add_stack.template
new file mode 100644
index 0000000000..c3af3172bd
--- /dev/null
+++ b/kubernetes/config/docker/init/src/config/robot/robot/assets/templates/heat_add_stack.template
@@ -0,0 +1,12 @@
+{
+ "files": {},
+ "disable_rollback": true,
+ "stack_name": "${stack_name}",
+ "parameters":
+ ${parameters}
+ ,
+ "template":
+ ${template}
+ ,
+ "timeout_mins": 60
+} \ No newline at end of file
diff --git a/kubernetes/config/docker/init/src/config/robot/robot/assets/templates/keystone_get_auth.template b/kubernetes/config/docker/init/src/config/robot/robot/assets/templates/keystone_get_auth.template
new file mode 100644
index 0000000000..2d62202db7
--- /dev/null
+++ b/kubernetes/config/docker/init/src/config/robot/robot/assets/templates/keystone_get_auth.template
@@ -0,0 +1,9 @@
+{
+ "auth": {
+ "passwordCredentials": {
+ "username": "${username}",
+ "password": "${password}"
+ },
+ "tenantName": "${username}"
+ }
+}
diff --git a/kubernetes/config/docker/init/src/config/robot/robot/assets/templates/neutron_add_network.template b/kubernetes/config/docker/init/src/config/robot/robot/assets/templates/neutron_add_network.template
new file mode 100644
index 0000000000..36382d47f4
--- /dev/null
+++ b/kubernetes/config/docker/init/src/config/robot/robot/assets/templates/neutron_add_network.template
@@ -0,0 +1,7 @@
+{
+ "network":
+ {
+ "name": "${name}",
+ "admin_state_up": false
+ }
+} \ No newline at end of file
diff --git a/kubernetes/config/docker/init/src/config/robot/robot/assets/templates/neutron_add_subnet.template b/kubernetes/config/docker/init/src/config/robot/robot/assets/templates/neutron_add_subnet.template
new file mode 100644
index 0000000000..5a4264f8cc
--- /dev/null
+++ b/kubernetes/config/docker/init/src/config/robot/robot/assets/templates/neutron_add_subnet.template
@@ -0,0 +1,8 @@
+{
+ "subnet": {
+ "network_id": "${network_id}",
+ "ip_version": 4,
+ "name":"${subnet_name}",
+ "cidr": "${cidr}"
+ }
+} \ No newline at end of file
diff --git a/kubernetes/config/docker/init/src/config/robot/robot/assets/templates/nova_add_keypair.template b/kubernetes/config/docker/init/src/config/robot/robot/assets/templates/nova_add_keypair.template
new file mode 100644
index 0000000000..52e2b068f4
--- /dev/null
+++ b/kubernetes/config/docker/init/src/config/robot/robot/assets/templates/nova_add_keypair.template
@@ -0,0 +1,6 @@
+{
+ "keypair": {
+ "name": "${name}",
+ "public_key": "${publickey}"
+ }
+} \ No newline at end of file
diff --git a/kubernetes/config/docker/init/src/config/robot/robot/assets/templates/nova_add_server.template b/kubernetes/config/docker/init/src/config/robot/robot/assets/templates/nova_add_server.template
new file mode 100644
index 0000000000..81578393c2
--- /dev/null
+++ b/kubernetes/config/docker/init/src/config/robot/robot/assets/templates/nova_add_server.template
@@ -0,0 +1,17 @@
+{
+ "server": {
+ "name": "${name}",
+ "imageRef": "${imageRef}",
+ "flavorRef": "${flavorRef}",
+ "config_drive": true,
+ "OS-DCF:diskConfig": "MANUAL",
+ "metadata": {
+ "${name}": "Server for attaching VVG"
+ },
+ "networks": [
+ {
+ "uuid": "00000000-0000-0000-0000-000000000000"
+ }
+ ]
+ }
+} \ No newline at end of file
diff --git a/kubernetes/config/docker/init/src/config/robot/robot/assets/templates/policy/closedloop_configpolicy.template b/kubernetes/config/docker/init/src/config/robot/robot/assets/templates/policy/closedloop_configpolicy.template
new file mode 100644
index 0000000000..e14b615db0
--- /dev/null
+++ b/kubernetes/config/docker/init/src/config/robot/robot/assets/templates/policy/closedloop_configpolicy.template
@@ -0,0 +1,31 @@
+{
+ "service": "TcaMetrics",
+ "location": "SampleServiceLocation",
+ "uuid": "/services/cdap-tca-hi-lo/instances/demo/configuration/metricsPerFunctionalRole/vFireWall",
+ "policyName": "${policy_name}",
+ "description": "vFirewall configuration Policy@CreatedBy:demo@CreatedBy:@ModifiedBy:demo@ModifiedBy:",
+ "configName": "SampleConfigName",
+ "templateVersion": "OpenSource.version.1",
+ "version": "1.0.0.5",
+ "priority": "1",
+ "policyScope": "resource=SampleResource,service=SampleService,type=SampleType,closedLoopControlName=SampleClosedLoop",
+ "content": {
+ "thresholds": [{
+ "severity": "MAJOR",
+ "fieldPath": "$$.event.measurementsForVfScalingFields.vNicUsageArray[*].packetsIn",
+ "thresholdValue": "300",
+ "closedLoopControlName": "CL-FRWL-LOW-TRAFFIC-SIG-d925ed73-8231-4d02-9545-db4e101f88f8",
+ "version": "1.0.2",
+ "direction": "LESS_OR_EQUAL"
+ }, {
+ "severity": "CRITICAL",
+ "fieldPath": "$$.event.measurementsForVfScalingFields.vNicUsageArray[*].packetsIn",
+ "thresholdValue": "800",
+ "closedLoopControlName": "CL-FRWL-LOW-TRAFFIC-SIG-d925ed73-8231-4d02-9545-db4e101f88f8",
+ "version": "1.0.2",
+ "direction": "GREATER_OR_EQUAL"
+ }],
+ "functionalRole": "vFirewall",
+ "name": "0"
+ }
+}
diff --git a/kubernetes/config/docker/init/src/config/robot/robot/assets/templates/policy/closedloop_createpolicy.template b/kubernetes/config/docker/init/src/config/robot/robot/assets/templates/policy/closedloop_createpolicy.template
new file mode 100644
index 0000000000..7c693e840b
--- /dev/null
+++ b/kubernetes/config/docker/init/src/config/robot/robot/assets/templates/policy/closedloop_createpolicy.template
@@ -0,0 +1,21 @@
+{
+ "policyConfigType": "BRMS_PARAM",
+ "policyName": "${policy_name}",
+ "policyDescription": "Create BRMS Param policy",
+ "attributes": {
+ "RULE": {
+ "templateName": "ClosedLoopDemo_closedLoopControlName",
+ "aaiNamedQueryUUID": "2",
+ "aaiPassword": "2",
+ "aaiPatternMatch": "2",
+ "aaiURL": "2",
+ "actor": "2",
+ "appcTopic": "2",
+ "closedLoopControlName": "2",
+ "msoPassword": "2",
+ "msoURL": "2",
+ "msoUsername": "2",
+ "aaiUsername": "3"
+ }
+ }
+}
diff --git a/kubernetes/config/docker/init/src/config/robot/robot/assets/templates/policy/closedloop_deletepolicy.template b/kubernetes/config/docker/init/src/config/robot/robot/assets/templates/policy/closedloop_deletepolicy.template
new file mode 100644
index 0000000000..55510102f2
--- /dev/null
+++ b/kubernetes/config/docker/init/src/config/robot/robot/assets/templates/policy/closedloop_deletepolicy.template
@@ -0,0 +1,5 @@
+{
+ "pdpGroup": "default",
+ "policyComponent": "PDP",
+ "policyName": "${policy_name}"
+}
diff --git a/kubernetes/config/docker/init/src/config/robot/robot/assets/templates/policy/closedloop_getconfigpolicy.template b/kubernetes/config/docker/init/src/config/robot/robot/assets/templates/policy/closedloop_getconfigpolicy.template
new file mode 100644
index 0000000000..34145e5b0d
--- /dev/null
+++ b/kubernetes/config/docker/init/src/config/robot/robot/assets/templates/policy/closedloop_getconfigpolicy.template
@@ -0,0 +1,8 @@
+{
+ "configAttributes" : {
+ },
+ "configName" : ".*",
+ "ecompName" : "DCAE",
+ "policyName" : "${config_policy_name}",
+ "unique" : true
+} \ No newline at end of file
diff --git a/kubernetes/config/docker/init/src/config/robot/robot/assets/templates/policy/closedloop_opspolicy.template b/kubernetes/config/docker/init/src/config/robot/robot/assets/templates/policy/closedloop_opspolicy.template
new file mode 100644
index 0000000000..722c9dcae7
--- /dev/null
+++ b/kubernetes/config/docker/init/src/config/robot/robot/assets/templates/policy/closedloop_opspolicy.template
@@ -0,0 +1,25 @@
+
+{
+ "policyConfigType": "BRMS_PARAM",
+ "policyName": "${policy_name}",
+ "policyDescription": "Create BRMS Param policy for vFW",
+ "attributes": {
+ "RULE": {
+ "templateName": "ControlLoopDemo__closedLoopControlName",
+ "closedLoopControlName": "CL-FRWL-LOW-TRAFFIC-SIG-d925ed73-8231-4d02-9545-db4e101f88f8",
+ "policyVersion": "v1.0",
+ "aaiNamedQueryUUID": "null",
+ "aaiPassword": "null",
+ "aaiURL": "null",
+ "actor": "APPC",
+ "appcTopic": "APPC-CL",
+ "msoPassword": "null",
+ "msoURL": "null",
+ "msoUsername": "null",
+ "aaiUsername": "null",
+ "notificationTopic": "POLICY-CL-MGT",
+ "aaiPatternMatch": 1
+ }
+ }
+}
+
diff --git a/kubernetes/config/docker/init/src/config/robot/robot/assets/templates/policy/closedloop_pushpolicy.template b/kubernetes/config/docker/init/src/config/robot/robot/assets/templates/policy/closedloop_pushpolicy.template
new file mode 100644
index 0000000000..ce1d4859d1
--- /dev/null
+++ b/kubernetes/config/docker/init/src/config/robot/robot/assets/templates/policy/closedloop_pushpolicy.template
@@ -0,0 +1,5 @@
+{
+ "policyName" : "${policy_name}",
+ "policyType" : "${policy_type}",
+ "pdpGroup" : "default"
+} \ No newline at end of file
diff --git a/kubernetes/config/docker/init/src/config/robot/robot/assets/templates/sdnc/dnsscaling_preload.template b/kubernetes/config/docker/init/src/config/robot/robot/assets/templates/sdnc/dnsscaling_preload.template
new file mode 100644
index 0000000000..278ee80da3
--- /dev/null
+++ b/kubernetes/config/docker/init/src/config/robot/robot/assets/templates/sdnc/dnsscaling_preload.template
@@ -0,0 +1,92 @@
+{
+ "input": {
+ "vnf-topology-information": {
+ "vnf-topology-identifier": {
+ "service-type": "${service_type}",
+ "vnf-name": "${vf_module_name}",
+ "vnf-type": "${vf_module_type}",
+ "generic-vnf-name": "${generic_vnf_name}",
+ "generic-vnf-type": "${generic_vnf_type}"
+ },
+ "vnf-assignments": {
+ "availability-zones": [],
+ "vnf-networks": [],
+ "vnf-vms": []
+ },
+ "vnf-parameters": [
+ {
+ "vnf-parameter-name": "repo_url_blob",
+ "vnf-parameter-value": "${repo_url_blob}"
+ },
+ {
+ "vnf-parameter-name": "repo_url_artifacts",
+ "vnf-parameter-value": "${repo_url_artifacts}"
+ },
+ {
+ "vnf-parameter-name": "demo_artifacts_version",
+ "vnf-parameter-value": "${demo_artifacts_version}"
+ },
+ {
+ "vnf-parameter-name": "ecomp_private_net_id",
+ "vnf-parameter-value": "${ecomp_private_net_id}"
+ },
+ {
+ "vnf-parameter-name": "ecomp_private_subnet_id",
+ "vnf-parameter-value": "${ecomp_private_subnet_id}"
+ },
+ {
+ "vnf-parameter-name": "ecomp_private_net_cidr",
+ "vnf-parameter-value": "${ecomp_private_net_cidr}"
+ },
+ {
+ "vnf-parameter-name": "vlb_private_net_id",
+ "vnf-parameter-value": "${vlb_private_net_id}"
+ },
+ {
+ "vnf-parameter-name": "vlb_private_ip_0",
+ "vnf-parameter-value": "${vlb_private_ip_0}"
+ },
+ {
+ "vnf-parameter-name": "vlb_private_ip_1",
+ "vnf-parameter-value": "${vlb_private_ip_1}"
+ },
+ {
+ "vnf-parameter-name": "vdns_private_ip_0",
+ "vnf-parameter-value": "${vdns_private_ip_0}"
+ },
+ {
+ "vnf-parameter-name": "vdns_private_ip_1",
+ "vnf-parameter-value": "${vdns_private_ip_1}"
+ },
+ {
+ "vnf-parameter-name": "vdns_name_0",
+ "vnf-parameter-value": "${scaling_vdns_name_0}"
+ },
+ {
+ "vnf-parameter-name": "dcae_collector_ip",
+ "vnf-parameter-value": "${dcae_collector_ip}"
+ },
+ {
+ "vnf-parameter-name": "key_name",
+ "vnf-parameter-value": "${key_name}"
+ },
+ {
+ "vnf-parameter-name": "pub_key",
+ "vnf-parameter-value": "${pub_key}"
+ }
+ ]
+ },
+ "request-information": {
+ "request-id": "robot12",
+ "order-version": "1",
+ "notification-url": "openecomp.org",
+ "order-number": "1",
+ "request-action": "PreloadVNFRequest"
+ },
+ "sdnc-request-header": {
+ "svc-request-id": "robot12",
+ "svc-notification-url": "http:\/\/openecomp.org:8080\/adapters\/rest\/SDNCNotify",
+ "svc-action": "reserve"
+ }
+ }
+} \ No newline at end of file
diff --git a/kubernetes/config/docker/init/src/config/robot/robot/assets/templates/sdnc/vfw_preload.template b/kubernetes/config/docker/init/src/config/robot/robot/assets/templates/sdnc/vfw_preload.template
new file mode 100644
index 0000000000..5b3f4a7a78
--- /dev/null
+++ b/kubernetes/config/docker/init/src/config/robot/robot/assets/templates/sdnc/vfw_preload.template
@@ -0,0 +1,128 @@
+{
+ "input": {
+ "vnf-topology-information": {
+ "vnf-topology-identifier": {
+ "service-type": "${service_type}",
+ "vnf-name": "${vf_module_name}",
+ "vnf-type": "${vf_module_type}",
+ "generic-vnf-name": "${generic_vnf_name}",
+ "generic-vnf-type": "${generic_vnf_type}"
+ },
+ "vnf-assignments": {
+ "availability-zones": [],
+ "vnf-networks": [],
+ "vnf-vms": []
+ },
+ "vnf-parameters": [
+ {
+ "vnf-parameter-name": "repo_url_blob",
+ "vnf-parameter-value": "${repo_url_blob}"
+ },
+ {
+ "vnf-parameter-name": "repo_url_artifacts",
+ "vnf-parameter-value": "${repo_url_artifacts}"
+ },
+ {
+ "vnf-parameter-name": "demo_artifacts_version",
+ "vnf-parameter-value": "${demo_artifacts_version}"
+ },
+ {
+ "vnf-parameter-name": "ecomp_private_net_id",
+ "vnf-parameter-value": "${ecomp_private_net_id}"
+ },
+ {
+ "vnf-parameter-name": "ecomp_private_subnet_id",
+ "vnf-parameter-value": "${ecomp_private_subnet_id}"
+ },
+ {
+ "vnf-parameter-name": "ecomp_private_net_cidr",
+ "vnf-parameter-value": "${ecomp_private_net_cidr}"
+ },
+ {
+ "vnf-parameter-name": "unprotected_private_net_id",
+ "vnf-parameter-value": "${unprotected_private_net_id}"
+ },
+ {
+ "vnf-parameter-name": "protected_private_net_id",
+ "vnf-parameter-value": "${protected_private_net_id}"
+ },
+ {
+ "vnf-parameter-name": "protected_private_net_cidr",
+ "vnf-parameter-value": "${protected_private_net_cidr}"
+ },
+ {
+ "vnf-parameter-name": "unprotected_private_net_cidr",
+ "vnf-parameter-value": "${unprotected_private_net_cidr}"
+ },
+ {
+ "vnf-parameter-name": "vfw_private_ip_0",
+ "vnf-parameter-value": "${vfw_private_ip_0}"
+ },
+ {
+ "vnf-parameter-name": "vfw_private_ip_1",
+ "vnf-parameter-value": "${vfw_private_ip_1}"
+ },
+ {
+ "vnf-parameter-name": "vfw_private_ip_2",
+ "vnf-parameter-value": "${vfw_private_ip_2}"
+ },
+ {
+ "vnf-parameter-name": "vpg_private_ip_0",
+ "vnf-parameter-value": "${vpg_private_ip_0}"
+ },
+ {
+ "vnf-parameter-name": "vpg_private_ip_1",
+ "vnf-parameter-value": "${vpg_private_ip_1}"
+ },
+ {
+ "vnf-parameter-name": "vsn_private_ip_0",
+ "vnf-parameter-value": "${vsn_private_ip_0}"
+ },
+ {
+ "vnf-parameter-name": "vsn_private_ip_1",
+ "vnf-parameter-value": "${vsn_private_ip_1}"
+ },
+ {
+ "vnf-parameter-name": "vfw_name_0",
+ "vnf-parameter-value": "${vfw_name_0}"
+ },
+ {
+ "vnf-parameter-name": "vpg_name_0",
+ "vnf-parameter-value": "${vpg_name_0}"
+ },
+ {
+ "vnf-parameter-name": "vsn_name_0",
+ "vnf-parameter-value": "${vsn_name_0}"
+ },
+ {
+ "vnf-parameter-name": "dcae_collector_ip",
+ "vnf-parameter-value": "${dcae_collector_ip}"
+ },
+ {
+ "vnf-parameter-name": "dcae_collector_port",
+ "vnf-parameter-value": "${dcae_collector_port}"
+ },
+ {
+ "vnf-parameter-name": "key_name",
+ "vnf-parameter-value": "${key_name}"
+ },
+ {
+ "vnf-parameter-name": "pub_key",
+ "vnf-parameter-value": "${pub_key}"
+ }
+ ]
+ },
+ "request-information": {
+ "request-id": "robot12",
+ "order-version": "1",
+ "notification-url": "openecomp.org",
+ "order-number": "1",
+ "request-action": "PreloadVNFRequest"
+ },
+ "sdnc-request-header": {
+ "svc-request-id": "robot12",
+ "svc-notification-url": "http:\/\/mso.onap-mso:8080\/adapters\/rest\/SDNCNotify",
+ "svc-action": "reserve"
+ }
+ }
+}
diff --git a/kubernetes/config/docker/init/src/config/robot/robot/assets/templates/sdnc/vlb_preload.template b/kubernetes/config/docker/init/src/config/robot/robot/assets/templates/sdnc/vlb_preload.template
new file mode 100644
index 0000000000..acc3c9d16c
--- /dev/null
+++ b/kubernetes/config/docker/init/src/config/robot/robot/assets/templates/sdnc/vlb_preload.template
@@ -0,0 +1,104 @@
+{
+ "input": {
+ "vnf-topology-information": {
+ "vnf-topology-identifier": {
+ "service-type": "${service_type}",
+ "vnf-name": "${vf_module_name}",
+ "vnf-type": "${vf_module_type}",
+ "generic-vnf-name": "${generic_vnf_name}",
+ "generic-vnf-type": "${generic_vnf_type}"
+ },
+ "vnf-assignments": {
+ "availability-zones": [],
+ "vnf-networks": [],
+ "vnf-vms": []
+ },
+ "vnf-parameters": [
+ {
+ "vnf-parameter-name": "repo_url_blob",
+ "vnf-parameter-value": "${repo_url_blob}"
+ },
+ {
+ "vnf-parameter-name": "repo_url_artifacts",
+ "vnf-parameter-value": "${repo_url_artifacts}"
+ },
+ {
+ "vnf-parameter-name": "demo_artifacts_version",
+ "vnf-parameter-value": "${demo_artifacts_version}"
+ },
+ {
+ "vnf-parameter-name": "ecomp_private_net_id",
+ "vnf-parameter-value": "${ecomp_private_net_id}"
+ },
+ {
+ "vnf-parameter-name": "ecomp_private_subnet_id",
+ "vnf-parameter-value": "${ecomp_private_subnet_id}"
+ },
+ {
+ "vnf-parameter-name": "ecomp_private_net_cidr",
+ "vnf-parameter-value": "${ecomp_private_net_cidr}"
+ },
+ {
+ "vnf-parameter-name": "vlb_private_net_id",
+ "vnf-parameter-value": "${vlb_private_net_id}"
+ },
+ {
+ "vnf-parameter-name": "vlb_private_net_cidr",
+ "vnf-parameter-value": "${vlb_private_net_cidr}"
+ },
+ {
+ "vnf-parameter-name": "vlb_private_ip_0",
+ "vnf-parameter-value": "${vlb_private_ip_0}"
+ },
+ {
+ "vnf-parameter-name": "vlb_private_ip_1",
+ "vnf-parameter-value": "${vlb_private_ip_1}"
+ },
+ {
+ "vnf-parameter-name": "vdns_private_ip_0",
+ "vnf-parameter-value": "${vdns_private_ip_0}"
+ },
+ {
+ "vnf-parameter-name": "vdns_private_ip_1",
+ "vnf-parameter-value": "${vdns_private_ip_1}"
+ },
+ {
+ "vnf-parameter-name": "vlb_name_0",
+ "vnf-parameter-value": "${vlb_name_0}"
+ },
+ {
+ "vnf-parameter-name": "vdns_name_0",
+ "vnf-parameter-value": "${vdns_name_0}"
+ },
+ {
+ "vnf-parameter-name": "dcae_collector_ip",
+ "vnf-parameter-value": "${dcae_collector_ip}"
+ },
+ {
+ "vnf-parameter-name": "dcae_collector_port",
+ "vnf-parameter-value": "${dcae_collector_port}"
+ },
+ {
+ "vnf-parameter-name": "key_name",
+ "vnf-parameter-value": "${key_name}"
+ },
+ {
+ "vnf-parameter-name": "pub_key",
+ "vnf-parameter-value": "${pub_key}"
+ }
+ ]
+ },
+ "request-information": {
+ "request-id": "robot12",
+ "order-version": "1",
+ "notification-url": "openecomp.org",
+ "order-number": "1",
+ "request-action": "PreloadVNFRequest"
+ },
+ "sdnc-request-header": {
+ "svc-request-id": "robot12",
+ "svc-notification-url": "http:\/\/openecomp.org:8080\/adapters\/rest\/SDNCNotify",
+ "svc-action": "reserve"
+ }
+ }
+} \ No newline at end of file
diff --git a/kubernetes/config/docker/init/src/config/robot/robot/assets/templates/sdnc/vvg_preload.template b/kubernetes/config/docker/init/src/config/robot/robot/assets/templates/sdnc/vvg_preload.template
new file mode 100644
index 0000000000..83095e9db3
--- /dev/null
+++ b/kubernetes/config/docker/init/src/config/robot/robot/assets/templates/sdnc/vvg_preload.template
@@ -0,0 +1,36 @@
+{
+ "input": {
+ "vnf-topology-information": {
+ "vnf-topology-identifier": {
+ "service-type": "${service_type}",
+ "vnf-name": "${vf_module_name}",
+ "vnf-type": "${vf_module_type}",
+ "generic-vnf-name": "${generic_vnf_name}",
+ "generic-vnf-type": "${generic_vnf_type}"
+ },
+ "vnf-assignments": {
+ "availability-zones": [],
+ "vnf-networks": [],
+ "vnf-vms": []
+ },
+ "vnf-parameters": [
+ {
+ "vnf-parameter-name": "nova_instance",
+ "vnf-parameter-value": "${nova_instance}"
+ }
+ ]
+ },
+ "request-information": {
+ "request-id": "robot12",
+ "order-version": "1",
+ "notification-url": "openecomp.org",
+ "order-number": "1",
+ "request-action": "PreloadVNFRequest"
+ },
+ "sdnc-request-header": {
+ "svc-request-id": "robot12",
+ "svc-notification-url": "http:\/\/openecomp.org:8080\/adapters\/rest\/SDNCNotify",
+ "svc-action": "reserve"
+ }
+ }
+} \ No newline at end of file
diff --git a/kubernetes/config/docker/init/src/config/robot/robot/assets/templates/template_example.template b/kubernetes/config/docker/init/src/config/robot/robot/assets/templates/template_example.template
new file mode 100644
index 0000000000..42583f14b8
--- /dev/null
+++ b/kubernetes/config/docker/init/src/config/robot/robot/assets/templates/template_example.template
@@ -0,0 +1,6 @@
+{
+ "requestReferences": {
+ "instanceId": "${instanceId}",
+ "requestId": "${requestId}"
+ }
+} \ No newline at end of file
diff --git a/kubernetes/config/docker/init/src/config/robot/robot/assets/templates/vfw_pg_stream_enable.template b/kubernetes/config/docker/init/src/config/robot/robot/assets/templates/vfw_pg_stream_enable.template
new file mode 100644
index 0000000000..c50363346a
--- /dev/null
+++ b/kubernetes/config/docker/init/src/config/robot/robot/assets/templates/vfw_pg_stream_enable.template
@@ -0,0 +1,4 @@
+ {
+ "id" : "${stream}",
+ "is-enabled" : "true"
+ }
diff --git a/kubernetes/config/docker/init/src/config/robot/robot/assets/templates/vfw_pg_streams_enable.template b/kubernetes/config/docker/init/src/config/robot/robot/assets/templates/vfw_pg_streams_enable.template
new file mode 100644
index 0000000000..8f5fec6160
--- /dev/null
+++ b/kubernetes/config/docker/init/src/config/robot/robot/assets/templates/vfw_pg_streams_enable.template
@@ -0,0 +1,7 @@
+{
+ "pg-streams" : {
+ "pg-stream" : [
+${pgstreams}
+ ]
+ }
+}
diff --git a/kubernetes/config/docker/init/src/config/robot/robot/assets/templates/web/index.html.template b/kubernetes/config/docker/init/src/config/robot/robot/assets/templates/web/index.html.template
new file mode 100644
index 0000000000..90ab320983
--- /dev/null
+++ b/kubernetes/config/docker/init/src/config/robot/robot/assets/templates/web/index.html.template
@@ -0,0 +1,116 @@
+<html><head>
+ <title>Quicklinks To Running Instances</title>
+ </head>
+
+ <body>
+ <h1>The Portal</h1>
+
+ The portal is the entry point to design/provision/operate ONAP. From there you can get to SDC, VID and Policy portals.
+
+ The portal can be found at:<p>
+
+ <a href="http://portal.api.simpledemo.openecomp.org:8989/ECOMPPORTAL/login.htm">Portal</a>
+ <p>
+ One requires role based user names and passwords to receive the full portal functionality. In the demo setup we pre provisioned:
+ <p>
+ <ul>
+ <li> jh0003 Admin </li>
+ <li> cs0008 Designer </li>
+ <li> jm0007 Tester </li>
+ <li> op0001 Operator </li>
+ <li> gv0001 Governance </li>
+ <li> pm0001 Product Manager </li>
+ <li> ps0001 Product Strategy </li>
+ </ul>
+ <p>
+ the password for all of them is: demo123456!
+
+ <h1> The Reality </h1>
+
+ As everything should go through the portal there are many subsystems which have there own GUI or API which come in very handy when debugging things. Here the most important once.
+
+ <h2> SDN-C </h2>
+
+ <a href="http://admin:Kp8bJ4SXszM0WXlhak3eHlcse2gAw84vaoGGmJvUy2U@${sdnc}:8282/apidoc/explorer/index.html"> Controller </a> with admin/Kp8bJ4SXszM0WXlhak3eHlcse2gAw84vaoGGmJvUy2U <p>
+
+ <a href="http://${sdnc}:8843/signup"> To sign up </a> <p>
+ <a href="http://${sdnc}:8843/login"> Admin </a> <p>
+
+ <h2> App-C </h2>
+
+ <a href="http://admin:Kp8bJ4SXszM0WXlhak3eHlcse2gAw84vaoGGmJvUy2U@${appc}:8282/apidoc/explorer/index.html"> Controller </a> with admin/Kp8bJ4SXszM0WXlhak3eHlcse2gAw84vaoGGmJvUy2U <p>
+
+ <h2> Policy </h2>
+
+ <a href="http://healthcheck:zb!XztG34@${policy}:6969/healthcheck"> Healthcheck </a> <p>
+
+ <h2> MSO </h2>
+
+ <a href="http://admin:Kp8bJ4SXszM0WXlhak3eHlcse2gAw84vaoGGmJvUy2U@${mso}:9990/"> JBOSS GUI </a> with admin/Kp8bJ4SXszM0WXlhak3eHlcse2gAw84vaoGGmJvUy2U <p>
+
+ <a href="http://${mso}:8080/camunda"> Camunda GUI </a> with admin/Kp8bJ4SXszM0WXlhak3eHlcse2gAw84vaoGGmJvUy2U <p>
+
+ <h2> DCAE </h2>
+
+ <h3> General GUIs </h3>
+ <a href="http://console:ZjJkYjllMjljMTI2M2Iz@${dcae_controller}:9998/resources"> DCAE Controller </a>
+ This might show up empty in a web browser as no content type is set in the response. If that's the case use curl: <p>
+
+ curl http://console:ZjJkYjllMjljMTI2M2Iz@${dcae_controller}:9998/resources <p>
+
+ <a href="http://${dcae_cdap}:9999/ns/TCA/apps/dcae-tca/programs/flows/TCAVESCollectorFlow/runs"> CDAP GUI </a> <p>
+
+ <h3> DCAE internal Message Router </h3>
+
+ <a href="http://${dcae_coll}:3904/topics"> Topics </a> <p>
+
+ <a href="http://${dcae_coll}:3904/events/unauthenticated.SEC_MEASUREMENT_OUTPUT/monitor/0?timeout=10000"> MR topic for collector to TCA </a> <p>
+
+ <a href="http://${dcae_coll}:3904/events/unauthenticated.TCA_EVENT_OUTPUT/monitor/0?timeout=10000"> MR topic for TCA alert to Policy </a> <p>
+
+ <h2> Message Router used between core components </h2>
+
+ <a href="http://${message_router}:3904/topics"> List of Topics </a> <p>
+
+ <h3> Topics of Interest </h3>
+
+ For topics without authentication one can monitor the traffic on a topic with: <p>
+
+ http://${message_router}:3904/events/PUT_TOPIC_HERE/group1/C1?timeout=5000 <p>
+
+ some important once listed below. <p>
+
+ <ul>
+ <li> <a href="http://${message_router}:3904/events/APPC-CL/monitor/0?timeout=10000"> APPC-CL Topic -- Policy Publishes Requests and APP-C publishes response </a>
+ <li> <a href="http://${message_router}:3904/events/PDPP-CONFIGURATION/monitor/0?timeout=10000"> PDPD-CONFIGURATION Topic </a>
+ <li> <a href="http://${message_router}:3904/events/POLICY-CL-MGT/monitor/0?timeout=10000"> POLICY-CL-MGT Topic -- Control loop operational policy </a>
+ <li> <a href="http://${message_router}:3904/events/DCAE-CL-EVENT/monitor/0?timeout=10000"> DCAE-CL-EVENT Topic -- Provides the Analytics output from DCAE</a>
+
+ </ul>
+
+ <h1> SSH to VM </h1>
+
+ The following links will open a shell and ssh to the various running VMs (at least on a Mac). It assumes that the .ssh/config file has been set appropriately and /etc/hosts has been updated to the running instance.<p>
+
+ <a href="ssh://${aai}"> AAI </a><p>
+ <a href="ssh://${policy}"> Policy </a><p>
+ <a href="ssh://${sdc}"> SDC </a><p>
+ <a href="ssh://${portal}"> Portal </a><p>
+ <a href="ssh://${dcae_controller}"> DCAE </a><p>
+ <a href="ssh://${appc}"> APP-C </a><p>
+ <a href="ssh://${mso}"> MSO </a><p>
+ <a href="ssh://${sdnc}"> SDN-C </a><p>
+ <a href="ssh://${vid}"> VID </a><p>
+ <a href="ssh://${message_router}"> Message Router </a><p>
+ <a href="ssh://${robot}"> Robot Framework for testing </a><p>
+ <a href="ssh://${onapdns}"> DNS server for management network </a><p>
+
+ Inside the VM you can list the docker containers by typing: <p>
+ docker ps <p>
+ and can get a shell prompt by executing the bash command.
+ For example: <p> docker exec -it openecompete_container bash <p>
+
+
+
+
+</body></html>
diff --git a/kubernetes/config/docker/init/src/config/robot/robot/resources/aaf_interface.robot b/kubernetes/config/docker/init/src/config/robot/robot/resources/aaf_interface.robot
new file mode 100644
index 0000000000..57d4aabccd
--- /dev/null
+++ b/kubernetes/config/docker/init/src/config/robot/robot/resources/aaf_interface.robot
@@ -0,0 +1,29 @@
+*** Settings ***
+Documentation The main interface for interacting with AAF. It handles low level stuff like managing the http request library and AAF required fields
+Library RequestsClientCert
+Library RequestsLibrary
+Library UUID
+
+Resource global_properties.robot
+
+*** Variables ***
+${AAF_HEALTH_CHECK_PATH} /authz/nss/org.openecomp
+
+*** Keywords ***
+Run AAF Health Check
+ [Documentation] Runs AAF Health check
+ ${resp}= Run AAF Get Request ${AAF_HEALTH_CHECK_PATH}
+ Should Be Equal As Strings ${resp.status_code} 200
+ Should Contain ${resp.json()} ns
+
+Run AAF Get Request
+ [Documentation] Runs AAF Get request
+ [Arguments] ${data_path}
+ ${auth}= Create List ${GLOBAL_AAF_USERNAME} ${GLOBAL_AAF_PASSWORD}
+ ${session}= Create Session aaf ${GLOBAL_AAF_SERVER} 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 aaf ${data_path} headers=${headers}
+ Log Received response from aaf ${resp.text}
+ [Return] ${resp}
+
diff --git a/kubernetes/config/docker/init/src/config/robot/robot/resources/aai/aai_interface.robot b/kubernetes/config/docker/init/src/config/robot/robot/resources/aai/aai_interface.robot
new file mode 100644
index 0000000000..11979f0b06
--- /dev/null
+++ b/kubernetes/config/docker/init/src/config/robot/robot/resources/aai/aai_interface.robot
@@ -0,0 +1,73 @@
+*** 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
+Resource ../global_properties.robot
+
+*** Variables ***
+${AAI_HEALTH_PATH} /aai/util/echo?action=long
+${VERSIONED_INDEX_PATH} /aai/v8
+
+*** 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}
+ ${auth}= Create List ${GLOBAL_AAI_USERNAME} ${GLOBAL_AAI_PASSWORD}
+ ${session}= Create Session aai ${GLOBAL_AAI_SERVER_URL} 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}
+ ${auth}= Create List ${GLOBAL_AAI_USERNAME} ${GLOBAL_AAI_PASSWORD}
+ ${session}= Create Session aai ${GLOBAL_AAI_SERVER_URL} 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}
+ ${auth}= Create List ${GLOBAL_AAI_USERNAME} ${GLOBAL_AAI_PASSWORD}
+ ${session}= Create Session aai ${GLOBAL_AAI_SERVER_URL} 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}
+ ${auth}= Create List ${GLOBAL_AAI_USERNAME} ${GLOBAL_AAI_PASSWORD}
+ ${session}= Create Session aai ${GLOBAL_AAI_SERVER_URL} 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
+
+ \ No newline at end of file
diff --git a/kubernetes/config/docker/init/src/config/robot/robot/resources/aai/create_customer.robot b/kubernetes/config/docker/init/src/config/robot/robot/resources/aai/create_customer.robot
new file mode 100644
index 0000000000..7ebda39de5
--- /dev/null
+++ b/kubernetes/config/docker/init/src/config/robot/robot/resources/aai/create_customer.robot
@@ -0,0 +1,41 @@
+*** Settings ***
+Documentation Create A&AI Customer API.
+...
+... Create A&AI Customer API
+
+Resource aai_interface.robot
+Resource ../json_templater.robot
+Library Collections
+Library OperatingSystem
+
+
+*** Variables ***
+${INDEX PATH} /aai/v8
+${ROOT_CUSTOMER_PATH} /business/customers/customer/
+${SYSTEM USER} robot-ete
+${A&AI ADD CUSTOMER BODY} robot/assets/templates/aai/add_customer.template
+
+*** Keywords ***
+Create Customer
+ [Documentation] Creates a customer in A&AI
+ [Arguments] ${customer_name} ${customer_id} ${customer_type} ${service_type} ${clouder_owner} ${cloud_region_id} ${tenant_id}
+ ${data_template}= OperatingSystem.Get File ${A&AI ADD CUSTOMER BODY}
+ ${arguments}= Create Dictionary subscriber_name=${customer_name} global_customer_id=${customer_id} subscriber_type=${customer_type} cloud_owner1=${clouder_owner} cloud_region_id1=${cloud_region_id} tenant_id1=${tenant_id} service1=${service_type}
+ ${data}= Fill JSON Template ${data_template} ${arguments}
+ ${put_resp}= Run A&AI Put Request ${INDEX PATH}${ROOT_CUSTOMER_PATH}${customer_id} ${data}
+ Should Be Equal As Strings ${put_resp.status_code} 201
+ [Return] ${put_resp.status_code}
+
+*** Keywords ***
+Delete Customer
+ [Documentation] Deletes a customer in A&AI
+ [Arguments] ${customer_id}
+ ${get_resp}= Run A&AI Get Request ${INDEX PATH}${ROOT_CUSTOMER_PATH}${customer_id}
+ Run Keyword If '${get_resp.status_code}' == '200' Delete Customer Exists ${customer_id} ${get_resp.json()['resource-version']}
+
+*** Keywords ***
+Delete Customer Exists
+ [Documentation] Deletes a customer in A&AI
+ [Arguments] ${customer_id} ${resource_version_id}
+ ${put_resp}= Run A&AI Delete Request ${INDEX PATH}${ROOT_CUSTOMER_PATH}${customer_id} ${resource_version_id}
+ Should Be Equal As Strings ${put_resp.status_code} 204
diff --git a/kubernetes/config/docker/init/src/config/robot/robot/resources/aai/create_service.robot b/kubernetes/config/docker/init/src/config/robot/robot/resources/aai/create_service.robot
new file mode 100644
index 0000000000..38aef3f664
--- /dev/null
+++ b/kubernetes/config/docker/init/src/config/robot/robot/resources/aai/create_service.robot
@@ -0,0 +1,75 @@
+*** Settings ***
+Documentation Create A&AI Customer API.
+...
+... Create A&AI Customer API
+
+Resource ../json_templater.robot
+Resource aai_interface.robot
+Library OperatingSystem
+Library Collections
+Library UUID
+
+
+
+*** Variables ***
+${INDEX PATH} /aai/v8
+${ROOT_SERVICE_PATH} /service-design-and-creation/services
+
+${SYSTEM USER} robot-ete
+${AAI_ADD_SERVICE_BODY}= robot/assets/templates/aai/add_service_body.template
+
+*** Keywords ***
+Create Service If Not Exists
+ [Documentation] Creates a service in A&AI if it doesn't exist
+ [Arguments] ${service_type}
+ ${dict}= Get Services
+ ${status} ${value}= Run Keyword And Ignore Error Dictionary Should Contain Key ${dict} ${service_type}
+ Run Keyword If '${status}' == 'FAIL' Create Service ${service_type}
+
+Create Service
+ [Documentation] Creates a service in A&AI
+ [Arguments] ${service_type}
+ ${uuid}= Generate UUID
+ ${data_template}= OperatingSystem.Get File ${AAI_ADD_SERVICE_BODY}
+ ${arguments}= Create Dictionary service_type=${service_type} UUID=${uuid}
+ ${data}= Fill JSON Template ${data_template} ${arguments}
+ ${fullpath}= Catenate ${INDEX PATH}${ROOT_SERVICE_PATH}/service/${uuid}
+ ${put_resp}= Run A&AI Put Request ${fullpath} ${data}
+ Should Be Equal As Strings ${put_resp.status_code} 201
+ [Return] ${put_resp.status_code}
+
+
+Delete Service If Exists
+ [Documentation] Deletes a service in A&AI if it exists
+ [Arguments] ${service_type}
+ ${dict}= Get Services
+ ${status} ${value}= Run Keyword And Ignore Error Dictionary Should Contain Key ${dict} ${service_type}
+ Run Keyword If '${status}' == 'PASS' Delete Service ${dict['${service_type}']}
+
+Delete Service
+ [Documentation] Delete passed service in A&AI
+ [Arguments] ${dict}
+ ${uuid}= Get From Dictionary ${dict} service-id
+ ${resource_version}= Get From Dictionary ${dict} resource-version
+ ${fullpath}= Catenate ${INDEX PATH}${ROOT_SERVICE_PATH}/service/${uuid}
+ ${resp}= Run A&AI Delete Request ${fullpath} ${resource_version}
+ Should Be Equal As Strings ${resp.status_code} 204
+
+
+Get Services
+ [Documentation] Creates a service in A&AI
+ ${resp}= Run A&AI Get Request ${INDEX PATH}${ROOT_SERVICE_PATH}
+ ${dict}= Create Dictionary
+ ${status} ${value}= Run Keyword And Ignore Error Should Be Equal As Strings ${resp.status_code} 200
+ Run Keyword If '${status}' == 'PASS' Update Service Dictionary ${dict} ${resp.json()}
+ [Return] ${dict}
+
+Update Service Dictionary
+ [Arguments] ${dict} ${json}
+ ${list}= Evaluate ${json}['service']
+ :for ${map} in @{list}
+ \ ${status} ${service_type}= Run Keyword And Ignore Error Get From Dictionary ${map} service-description
+ \ Run Keyword If '${status}' == 'PASS' Set To Dictionary ${dict} ${service_type}=${map}
+ Log ${dict}
+
+
diff --git a/kubernetes/config/docker/init/src/config/robot/robot/resources/aai/create_tenant.robot b/kubernetes/config/docker/init/src/config/robot/robot/resources/aai/create_tenant.robot
new file mode 100644
index 0000000000..756882e7c3
--- /dev/null
+++ b/kubernetes/config/docker/init/src/config/robot/robot/resources/aai/create_tenant.robot
@@ -0,0 +1,98 @@
+*** Settings ***
+Documentation Create A&AI Customer API.
+...
+... Create A&AI Customer API
+
+Resource ../json_templater.robot
+Resource aai_interface.robot
+Library OperatingSystem
+Library Collections
+
+
+
+*** Variables ***
+${INDEX PATH} /aai/v8
+${ROOT_TENANT_PATH} /cloud-infrastructure/cloud-regions/cloud-region/
+
+${SYSTEM USER} robot-ete
+${AAI_ADD_TENANT_BODY}= robot/assets/templates/aai/add_tenant_body.template
+
+*** Keywords ***
+Inventory Tenant If Not Exists
+ [Documentation] Creates a service in A&AI if it doesn't exist
+ [Arguments] ${cloud_owner} ${cloud_region_id} ${cloud_type} ${owner_defined_type} ${cloud_region_version} ${cloud_zone} ${tenant_id} ${tenant_name}
+ ${dict}= Get Tenants ${cloud_owner} ${cloud_region_id}
+ ${status} ${value}= Run Keyword And Ignore Error Dictionary Should Contain Key ${dict} ${tenant_id}
+ Run Keyword If '${status}' == 'FAIL' Inventory Tenant ${cloud_owner} ${cloud_region_id} ${cloud_type} ${owner_defined_type} ${cloud_region_version} ${cloud_zone} ${tenant_id} ${tenant_name}
+
+Inventory Tenant
+ [Documentation] Inventorys a Tenant in A&AI
+ [Arguments] ${cloud_owner} ${cloud_region_id} ${cloud_type} ${owner_defined_type} ${cloud_region_version} ${cloud_zone} ${tenant_id} ${tenant_name}
+ ${json_resource_version}= Get Resource Version If Exists ${cloud_owner} ${cloud_region_id} ${cloud_type} ${owner_defined_type} ${cloud_region_version} ${cloud_zone}
+ ${data_template}= OperatingSystem.Get File ${AAI_ADD_TENANT_BODY}
+ ${arguments}= Create Dictionary cloud_owner=${cloud_owner} cloud_region_id=${cloud_region_id} cloud_type=${cloud_type} owner_defined_type=${owner_defined_type} cloud_region_version=${cloud_region_version} cloud_zone=${cloud_zone} tenant_id=${tenant_id} tenant_name=${tenant_name} resource_version=${json_resource_version}
+ ${data}= Fill JSON Template ${data_template} ${arguments}
+ ${put_resp}= Run A&AI Put Request ${INDEX PATH}${ROOT_TENANT_PATH}${cloud_owner}/${cloud_region_id} ${data}
+ ${status_string}= Convert To String ${put_resp.status_code}
+ Should Match Regexp ${status_string} ^(201|200)$
+
+Get Resource Version If Exists
+ [Documentation] Creates a service in A&AI if it doesn't exist
+ [Arguments] ${cloud_owner} ${cloud_region_id} ${cloud_type} ${owner_defined_type} ${cloud_region_version} ${cloud_zone}
+ ${resource_version}= Set Variable
+ ${resp}= Get Cloud Region ${cloud_owner} ${cloud_region_id}
+ Return from Keyword if '${resp.status_code}' != '200' ${resource_version}
+ ${json}= Set Variable ${resp.json()}
+ ${resource_version}= Catenate ${json['resource-version']}
+ [Return] "resource-version":"${resource_version}",
+
+
+Delete Tenant
+ [Documentation] Removes both Tenant
+ [Arguments] ${tenant_id} ${cloud_owner} ${cloud_region_id}
+ ${get_resp}= Run A&AI Get Request ${INDEX PATH}${ROOT_TENANT_PATH}${cloud_owner}/${cloud_region_id}/tenants/tenant/${tenant_id}
+ Run Keyword If '${get_resp.status_code}' == '200' Delete Tenant Exists ${tenant_id} ${cloud_owner} ${cloud_region_id} ${get_resp.json()['resource-version']}
+
+Delete Tenant Exists
+ [Arguments] ${tenant_id} ${cloud_owner} ${cloud_region_id} ${resource_version}
+ ${put_resp}= Run A&AI Delete Request ${INDEX PATH}${ROOT_TENANT_PATH}${cloud_owner}/${cloud_region_id}/tenants/tenant/${tenant_id} ${resource_version}
+ Should Be Equal As Strings ${put_resp.status_code} 204
+
+Delete Cloud Region
+ [Documentation] Removes both Tenant and Cloud Region in A&AI
+ [Arguments] ${tenant_id} ${cloud_owner} ${cloud_region_id}
+ ${get_resp}= Run A&AI Get Request ${INDEX PATH}${ROOT_TENANT_PATH}${cloud_owner}/${cloud_region_id}
+ Run Keyword If '${get_resp.status_code}' == '200' Delete Cloud Region Exists ${tenant_id} ${cloud_owner} ${cloud_region_id} ${get_resp.json()['resource-version']}
+
+Delete Cloud Region Exists
+ [Documentation] Delete may get status 400 (Bad Request) if the region is still referenced
+ [Arguments] ${tenant_id} ${cloud_owner} ${cloud_region_id} ${resource_version}
+ ${put_resp}= Run A&AI Delete Request ${INDEX PATH}${ROOT_TENANT_PATH}${cloud_owner}/${cloud_region_id} ${resource_version}
+ ${status_string}= Convert To String ${put_resp.status_code}
+ Should Match Regexp ${status_string} ^(204|400)$
+
+Get Tenants
+ [Documentation] Return list of tenants for this cloud owner/region
+ [Arguments] ${cloud_owner} ${cloud_region_id}
+ ${resp}= Run A&AI Get Request ${INDEX PATH}${ROOT_TENANT_PATH}${cloud_owner}/${cloud_region_id}/tenants
+ ${dict}= Create Dictionary
+ ${status} ${value}= Run Keyword And Ignore Error Should Be Equal As Strings ${resp.status_code} 200
+ Run Keyword If '${status}' == 'PASS' Update Tenant Dictionary ${dict} ${resp.json()}
+ [Return] ${dict}
+
+Get Cloud Region
+ [Documentation] Returns the Cloud Region if it exists
+ [Arguments] ${cloud_owner} ${cloud_region_id}
+ ${resp}= Run A&AI Get Request ${INDEX PATH}${ROOT_TENANT_PATH}${cloud_owner}/${cloud_region_id}
+ [Return] ${resp}
+
+Update Tenant Dictionary
+ [Arguments] ${dict} ${json}
+ ${list}= Evaluate ${json}['tenant']
+ :for ${map} in @{list}
+ \ ${status} ${tenant_id}= Run Keyword And Ignore Error Get From Dictionary ${map} tenant-id
+ \ Run Keyword If '${status}' == 'PASS' Set To Dictionary ${dict} ${tenant_id}=${map}
+ Log ${dict}
+
+
+
diff --git a/kubernetes/config/docker/init/src/config/robot/robot/resources/aai/network.robot b/kubernetes/config/docker/init/src/config/robot/robot/resources/aai/network.robot
new file mode 100644
index 0000000000..a42461e269
--- /dev/null
+++ b/kubernetes/config/docker/init/src/config/robot/robot/resources/aai/network.robot
@@ -0,0 +1,42 @@
+*** Settings ***
+Documentation Validate A&AI Serivce Instance
+...
+... Validate A&AI Serivce Instance
+
+Resource aai_interface.robot
+Library Collections
+Library OperatingSystem
+Library RequestsLibrary
+Library JSONUtils
+Library HttpLibrary.HTTP
+
+Resource ../json_templater.robot
+
+*** Variables ***
+${INDEX PATH} /aai/v8
+${GENERIC_QUERY_PATH} /search/generic-query?
+${SYSTEM USER} robot-ete
+${CUSTOMER SPEC PATH} /business/customers/customer/
+${SERVICE SUBSCRIPTIONS} /service-subscriptions/service-subscription/
+${SERVICE INSTANCE} /service-instances?service-instance-name=
+${SERVCE INSTANCE TEMPLATE} robot/assets/templates/aai/service_subscription.template
+
+*** Keywords ***
+Validate Network
+ [Documentation] Query and Validates A&AI Service Instance
+ [Arguments] ${service_instance_name} ${service_type} ${customer_id}
+ ${resp}= Run A&AI Get Request ${INDEX PATH}${CUSTOMER SPEC PATH}${CUSTOMER ID}${SERVICE SUBSCRIPTIONS}${service_type}${SERVICE INSTANCE}${service_instance_name}
+ Dictionary Should Contain Value ${resp.json()['service-instance'][0]} ${service_instance_name}
+
+
+
+*** Keywords ***
+Create Network
+ [Documentation] Query and Validates A&AI Service Instance
+ [Arguments] ${CUSTOMER ID}
+ ${json_string}= Catenate { "service-type": "VDNS" , "service-subscriptions":[{"service-instance-id":"instanceid123","service-instance-name":"VDNS"}]}
+ ${put_resp}= Run A&AI Put Request ${INDEX PATH}${CUSTOMER SPEC PATH}${CUSTOMER ID}${SERVICE SUBSCRIPTIONS}/VDNS ${json_string}
+ Should Be Equal As Strings ${put_resp.status_code} 201
+ [Return] ${put_resp.status_code}
+
+ \ No newline at end of file
diff --git a/kubernetes/config/docker/init/src/config/robot/robot/resources/aai/service_instance.robot b/kubernetes/config/docker/init/src/config/robot/robot/resources/aai/service_instance.robot
new file mode 100644
index 0000000000..5bae2f7457
--- /dev/null
+++ b/kubernetes/config/docker/init/src/config/robot/robot/resources/aai/service_instance.robot
@@ -0,0 +1,110 @@
+*** Settings ***
+Documentation Validate A&AI Serivce Instance
+...
+... Validate A&AI Serivce Instance
+
+Resource aai_interface.robot
+Library Collections
+Library OperatingSystem
+Library RequestsLibrary
+Library JSONUtils
+Library HttpLibrary.HTTP
+Library StringTemplater
+Resource ../json_templater.robot
+Resource ../stack_validation/validate_vlb.robot
+Resource ../stack_validation/validate_vfw.robot
+Resource ../stack_validation/validate_vvg.robot
+Resource ../aai/aai_interface.robot
+
+*** Variables ***
+${INDEX PATH} /aai/v8
+${GENERIC_QUERY_PATH} /search/generic-query?
+${SYSTEM USER} robot-ete
+${CUSTOMER SPEC PATH} /business/customers/customer/
+${SERVICE SUBSCRIPTIONS} /service-subscriptions/service-subscription/
+${SERVICE INSTANCE} /service-instances?service-instance-id=
+${SERVCE INSTANCE TEMPLATE} robot/assets/templates/aai/service_subscription.template
+
+${GENERIC_VNF_PATH_TEMPLATE} /network/generic-vnfs/generic-vnf/\${vnf_id}/vf-modules/vf-module/\${vf_module_id}
+${GENERIC_VNF_QUERY_TEMPLATE} /network/generic-vnfs/generic-vnf/\${vnf_id}/vf-modules/vf-module?vf-module-name=\${vf_module_name}
+${VLB_CLOSED_LOOP_HACK_BODY} robot/assets/templates/aai/vlb_closed_loop_hack.template
+
+#*************** Test Case Variables *************
+${VLB_CLOSED_LOOP_DELETE}
+${VLB_CLOSED_LOOP_VNF_ID}
+
+*** Keywords ***
+Validate Service Instance
+ [Documentation] Query and Validates A&AI Service Instance
+ [Arguments] ${service_instance_name} ${service_type} ${customer_name}
+ ${cust_resp}= Run A&AI Get Request ${INDEX PATH}/business/customers?subscriber-name=${customer_name}
+ ${resp}= Run A&AI Get Request ${INDEX PATH}${CUSTOMER SPEC PATH}${cust_resp.json()['customer'][0]['global-customer-id']}${SERVICE SUBSCRIPTIONS}${service_type}${SERVICE INSTANCE}${service_instance_name}
+ Dictionary Should Contain Value ${resp.json()['service-instance'][0]} ${service_instance_name}
+ Dictionary Should Contain Key ${resp.json()['service-instance'][0]} persona-model-id
+ Dictionary Should Contain Key ${resp.json()['service-instance'][0]} persona-model-version
+
+Validate Generic VNF
+ [Documentation] Query and Validates A&AI Service Instance
+ [Arguments] ${vnf_name} ${vnf_type} ${service_instance_id}
+ ${generic_vnf}= Run A&AI Get Request ${INDEX PATH}/network/generic-vnfs/generic-vnf?vnf-name=${vnf_name}
+ Dictionary Should Contain Value ${generic_vnf.json()} ${vnf_name}
+ ${returned_vnf_type}= Get From Dictionary ${generic_vnf.json()} vnf-type
+ Should Contain ${returned_vnf_type} ${vnf_type}
+ [Return] ${generic_vnf.json()}
+
+VLB Closed Loop Hack
+ [Arguments] ${service} ${generic_vnf} ${closedloop_vf_module}
+ Return From Keyword If '${service}' != 'vLB'
+ ${vnf_id}= Get From Dictionary ${generic_vnf} vnf-id
+ ${vf_modules}= Get From Dictionary ${generic_vnf} vf-modules
+ ${list}= Get From Dictionary ${vf_modules} vf-module
+ ${vfmodule}= Get From List ${list} 0
+ ${persona_model_id}= Get From Dictionary ${closedloop_vf_module} invariantUUID
+ ${persona_model_version}= Get From Dictionary ${closedloop_vf_module} version
+ ${dummy}= Catenate dummy_${vnf_id}
+ ${dict}= Create Dictionary vnf_id=${vnf_id} vf_module_id=${dummy} persona_model_id=${persona_model_id} persona_model_version=${persona_model_version}
+ ${datapath}= Template String ${GENERIC_VNF_PATH_TEMPLATE} ${dict}
+ ${data}= Fill JSON Template File ${VLB_CLOSED_LOOP_HACK_BODY} ${dict}
+ ${put_resp}= Run A&AI Put Request ${INDEX PATH}${datapath} ${data}
+ ${status_string}= Convert To String ${put_resp.status_code}
+ Should Match Regexp ${status_string} ^(201|412)$
+ Set Test Variable ${VLB_CLOSED_LOOP_DELETE} ${datapath}
+ Set Test Variable ${VLB_CLOSED_LOOP_VNF_ID} ${vnf_id}
+
+
+VLB Closed Loop Hack Update
+ [Documentation] Update the A&AI vDNS scaling vf module to have persona-model-version 1 rather than 1.0
+ [Arguments] ${stack_name}
+ ${dict}= Create Dictionary vnf_id=${VLB_CLOSED_LOOP_VNF_ID} vf_module_name=${stack_name}
+ ${query}= Template String ${GENERIC_VNF_QUERY_TEMPLATE} ${dict}
+ ${get_resp}= Run A&AI Get Request ${INDEX_PATH}${query}
+ ${json}= Set Variable ${get_resp.json()}
+ Set to Dictionary ${json} persona-model-version 1
+ ${vf_module_id}= Get From Dictionary ${json} vf-module-id
+ Set to Dictionary ${dict} vf_module_id=${vf_module_id}
+ ${uri}= Template String ${GENERIC_VNF_PATH_TEMPLATE} ${dict}
+ ${resp}= Run A&AI Put Request ${INDEX_PATH}${uri} ${json}
+ ${get_resp}= Run A&AI Get Request ${INDEX_PATH}${query}
+
+
+Teardown VLB Closed Loop Hack
+ Return From Keyword If ' ${VLB_CLOSED_LOOP_DELETE}' == ''
+ Delete A&AI Entity ${VLB_CLOSED_LOOP_DELETE}
+
+
+Validate VF Module
+ [Documentation] Query and Validates A&AI Service Instance
+ [Arguments] ${vf_module_name} ${stack_type}
+ Run Keyword If '${stack_type}'=='vLB' Validate vLB Stack ${vf_module_name}
+ Run Keyword If '${stack_type}'=='vFW' Validate Firewall Stack ${vf_module_name}
+ Run Keyword If '${stack_type}'=='vVG' Validate vVG Stack ${vf_module_name}
+
+*** Keywords ***
+Create AAI Service Instance
+ [Documentation] Query and Validates A&AI Service Instance
+ [Arguments] ${customer_id} ${service_type} ${service_instance_id} ${service_instance_name}
+ ${json_string}= Catenate { "service-type": "VDNS" , "service-subscriptions":[{"service-instance-id":"instanceid123","service-instance-name":"VDNS"}]}
+ ${put_resp}= Run A&AI Put Request ${INDEX PATH}${CUSTOMER SPEC PATH}${CUSTOMER ID}${SERVICE SUBSCRIPTIONS}/{service_type} ${json_string}
+ Should Be Equal As Strings ${put_resp.status_code} 201
+ [Return] ${put_resp.status_code}
+
diff --git a/kubernetes/config/docker/init/src/config/robot/robot/resources/aai/volume_group.robot b/kubernetes/config/docker/init/src/config/robot/robot/resources/aai/volume_group.robot
new file mode 100644
index 0000000000..9582201154
--- /dev/null
+++ b/kubernetes/config/docker/init/src/config/robot/robot/resources/aai/volume_group.robot
@@ -0,0 +1,31 @@
+*** Settings ***
+Documentation Validate A&AI Serivce Instance
+...
+... Validate A&AI Serivce Instance
+
+Resource aai_interface.robot
+Library Collections
+Library OperatingSystem
+Library RequestsLibrary
+Library JSONUtils
+Library HttpLibrary.HTTP
+
+Resource ../json_templater.robot
+
+*** Variables ***
+${INDEX PATH} /aai/v8
+${GENERIC_QUERY_PATH} /search/generic-query?
+${SYSTEM USER} robot-ete
+${CUSTOMER SPEC PATH} /business/customers/customer/
+${SERVICE SUBSCRIPTIONS} /service-subscriptions/service-subscription/
+${SERVICE INSTANCE} /service-instances?service-instance-name=
+${SERVCE INSTANCE TEMPLATE} robot/assets/templates/aai/service_subscription.template
+
+*** Keywords ***
+Validate Volume Group
+ [Arguments] ${service_instance_name} ${service_type} ${customer_id}
+ ${resp}= Run A&AI Get Request ${INDEX PATH}${CUSTOMER SPEC PATH}${CUSTOMER ID}${SERVICE SUBSCRIPTIONS}${service_type}${SERVICE INSTANCE}${service_instance_name}
+ Dictionary Should Contain Value ${resp.json()['service-instance'][0]} ${service_instance_name}
+
+
+ \ No newline at end of file
diff --git a/kubernetes/config/docker/init/src/config/robot/robot/resources/appc_interface.robot b/kubernetes/config/docker/init/src/config/robot/robot/resources/appc_interface.robot
new file mode 100644
index 0000000000..2dbd979bf4
--- /dev/null
+++ b/kubernetes/config/docker/init/src/config/robot/robot/resources/appc_interface.robot
@@ -0,0 +1,54 @@
+*** Settings ***
+Documentation The main interface for interacting with APP-C. It handles low level stuff like managing the http request library and APP-C required fields
+Library RequestsLibrary
+Library UUID
+Library OperatingSystem
+Library StringTemplater
+Resource global_properties.robot
+
+*** Variables ***
+${APPC_INDEX_PATH} /restconf
+${APPC_HEALTHCHECK_OPERATION_PATH} /operations/SLI-API:healthcheck
+${APPC_CREATE_MOUNTPOINT_PATH} /config/network-topology:network-topology/topology/topology-netconf/node/
+${APPC_MOUNT_XML} robot/assets/templates/appc/vnf_mount.template
+
+*** Keywords ***
+Run APPC Health Check
+ [Documentation] Runs an APPC healthcheck
+ ${resp}= Run APPC Post Request ${APPC_INDEX PATH}${APPC_HEALTHCHECK_OPERATION_PATH} ${None}
+ Should Be Equal As Strings ${resp.status_code} 200
+ Should Be Equal As Strings ${resp.json()['output']['response-code']} 200
+
+Run APPC Post Request
+ [Documentation] Runs an APPC post request
+ [Arguments] ${data_path} ${data} ${content}=json
+ ${auth}= Create List ${GLOBAL_APPC_USERNAME} ${GLOBAL_APPC_PASSWORD}
+ Log Creating session ${GLOBAL_APPC_SERVER}
+ ${session}= Create Session appc ${GLOBAL_APPC_SERVER} auth=${auth}
+ ${uuid}= Generate UUID
+ ${headers}= Create Dictionary Accept=application/${content} Content-Type=application/${content} X-TransactionId=${GLOBAL_APPLICATION_ID}-${uuid} X-FromAppId=${GLOBAL_APPLICATION_ID}
+ ${resp}= Post Request appc ${data_path} data=${data} headers=${headers}
+ Log Received response from appc ${resp.text}
+ [Return] ${resp}
+
+Run APPC Put Request
+ [Documentation] Runs an APPC post request
+ [Arguments] ${data_path} ${data} ${content}=xml
+ ${auth}= Create List ${GLOBAL_APPC_USERNAME} ${GLOBAL_APPC_PASSWORD}
+ Log Creating session ${GLOBAL_APPC_SERVER}
+ ${session}= Create Session appc ${GLOBAL_APPC_SERVER} auth=${auth}
+ ${uuid}= Generate UUID
+ ${headers}= Create Dictionary Accept=application/${content} Content-Type=application/${content} X-TransactionId=${GLOBAL_APPLICATION_ID}-${uuid} X-FromAppId=${GLOBAL_APPLICATION_ID}
+ ${resp}= Put Request appc ${data_path} data=${data} headers=${headers}
+ Log Received response from appc ${resp.text}
+ [Return] ${resp}
+
+Create Mount Point In APPC
+ [Documentation] Go tell APPC about the PGN we just spun up...
+ [Arguments] ${nodeid} ${host} ${port}=${GLOBAL_PGN_PORT} ${username}=admin ${password}=admin
+ ${dict}= Create Dictionary nodeid=${nodeid} host=${host} port=${port} username=${username} password=${password}
+ ${template}= OperatingSystem.Get File ${APPC_MOUNT_XML}
+ ${data}= Template String ${template} ${dict}
+ ${resp}= Run APPC Put Request ${APPC_INDEX PATH}${APPC_CREATE_MOUNTPOINT_PATH}${nodeid} ${data}
+ Should Be Equal As Strings ${resp.status_code} 200
+ [Return] ${resp} \ No newline at end of file
diff --git a/kubernetes/config/docker/init/src/config/robot/robot/resources/asdc_interface.robot b/kubernetes/config/docker/init/src/config/robot/robot/resources/asdc_interface.robot
new file mode 100644
index 0000000000..36a18811d1
--- /dev/null
+++ b/kubernetes/config/docker/init/src/config/robot/robot/resources/asdc_interface.robot
@@ -0,0 +1,464 @@
+*** Settings ***
+Documentation The main interface for interacting with ASDC. It handles low level stuff like managing the http request library and DCAE required fields
+Library RequestsLibrary
+Library UUID
+Library JSONUtils
+Library OperatingSystem
+Library Collections
+Library ExtendedSelenium2Library
+Resource global_properties.robot
+Resource browser_setup.robot
+Resource json_templater.robot
+*** Variables ***
+${ASDC_DESIGNER_USER_ID} cs0008
+${ASDC_TESTER_USER_ID} jm0007
+${ASDC_GOVERNOR_USER_ID} gv0001
+${ASDC_OPS_USER_ID} op0001
+${ASDC_HEALTH_CHECK_PATH} /sdc1/rest/healthCheck
+${ASDC_VENDOR_LICENSE_MODEL_PATH} /onboarding-api/v1.0/vendor-license-models
+${ASDC_VENDOR_SOFTWARE_PRODUCT_PATH} /onboarding-api/v1.0/vendor-software-products
+${ASDC_VENDOR_KEY_GROUP_PATH} /license-key-groups
+${ASDC_VENDOR_ENTITLEMENT_POOL_PATH} /entitlement-pools
+${ASDC_VENDOR_FEATURE_GROUP_PATH} /feature-groups
+${ASDC_VENDOR_LICENSE_AGREEMENT_PATH} /license-agreements
+${ASDC_VENDOR_ACTIONS_PATH} /actions
+${ASDC_VENDOR_SOFTWARE_UPLOAD_PATH} /upload
+${ASDC_CATALOG_RESOURCES_PATH} /sdc2/rest/v1/catalog/resources
+${ASDC_CATALOG_SERVICES_PATH} /sdc2/rest/v1/catalog/services
+${ASDC_CATALOG_INACTIVE_RESOURCES_PATH} /sdc2/rest/v1/inactiveComponents/resource
+${ASDC_CATALOG_INACTIVE_SERVICES_PATH} /sdc2/rest/v1/inactiveComponents/service
+${ASDC_CATALOG_LIFECYCLE_PATH} /lifecycleState
+${ASDC_CATALOG_SERVICE_RESOURCE_INSTANCE_PATH} /resourceInstance
+${ASDC_CATALOG_SERVICE_DISTRIBUTION_STATE_PATH} /distribution-state
+${ASDC_CATALOG_SERVICE_DISTRIBUTION_PATH} /distribution
+${ASDC_DISTRIBUTION_STATE_APPROVE_PATH} /approve
+${ASDC_CATALOG_SERVICE_DISTRIBUTION_ACTIVATE_PATH} /distribution/PROD/activate
+${ASDC_LICENSE_MODEL_TEMPLATE} robot/assets/templates/asdc/license_model.template
+${ASDC_KEY_GROUP_TEMPLATE} robot/assets/templates/asdc/key_group.template
+${ASDC_ENTITLEMENT_POOL_TEMPLATE} robot/assets/templates/asdc/entitlement_pool.template
+${ASDC_FEATURE_GROUP_TEMPLATE} robot/assets/templates/asdc/feature_group.template
+${ASDC_LICENSE_AGREEMENT_TEMPLATE} robot/assets/templates/asdc/license_agreement.template
+${ASDC_ACTION_TEMPLATE} robot/assets/templates/asdc/action.template
+${ASDC_SOFTWARE_PRODUCT_TEMPLATE} robot/assets/templates/asdc/software_product.template
+${ASDC_CATALOG_RESOURCE_TEMPLATE} robot/assets/templates/asdc/catalog_resource.template
+${ASDC_USER_REMARKS_TEMPLATE} robot/assets/templates/asdc/user_remarks.template
+${ASDC_CATALOG_SERVICE_TEMPLATE} robot/assets/templates/asdc/catalog_service.template
+${ASDC_RESOURCE_INSTANCE_TEMPLATE} robot/assets/templates/asdc/resource_instance.template
+*** Keywords ***
+Distribute Model From ASDC
+ [Documentation] goes end to end creating all the asdc objects based ona model and distributing it to the systems. it then returns the service name, vf name and vf module name
+ [Arguments] ${model_zip_path} ${catalog_service_name}=
+ ${catalog_service_id}= Add ASDC Catalog Service ${catalog_service_name}
+ ${catalog_resource_ids}= Create List
+ : FOR ${zip} IN @{model_zip_path}
+ \ ${loop_catalog_resource_id}= Setup ASDC Catalog Resource ${zip}
+ \ Append To List ${catalog_resource_ids} ${loop_catalog_resource_id}
+ \ ${loop_catalog_resource_resp}= Get ASDC Catalog Resource ${loop_catalog_resource_id}
+ \ Add ASDC Resource Instance ${catalog_service_id} ${loop_catalog_resource_id} ${loop_catalog_resource_resp['name']}
+ ${catalog_service_resp}= Get ASDC Catalog Service ${catalog_service_id}
+ Checkin ASDC Catalog Service ${catalog_service_id}
+ Request Certify ASDC Catalog Service ${catalog_service_id}
+ Start Certify ASDC Catalog Service ${catalog_service_id}
+ # on certify it gets a new id
+ ${catalog_service_id}= Certify ASDC Catalog Service ${catalog_service_id}
+ Approve ASDC Catalog Service ${catalog_service_id}
+ Distribute ASDC Catalog Service ${catalog_service_id}
+ ${catalog_service_resp}= Get ASDC Catalog Service ${catalog_service_id}
+ ${vf_module}= Find Element In Array ${loop_catalog_resource_resp['groups']} type org.openecomp.groups.VfModule
+ [Return] ${catalog_service_resp['name']} ${loop_catalog_resource_resp['name']} ${vf_module} ${catalog_resource_ids} ${catalog_service_id}
+ Check Catalog Service Distributed ${catalog_service_resp['uuid']}
+Setup ASDC Catalog Resource
+ [Documentation] Creates all the steps a vf needs for an asdc catalog resource and returns the id
+ [Arguments] ${model_zip_path}
+ ${license_model_id}= Add ASDC License Model
+ ${key_group_id}= Add ASDC License Group ${license_model_id}
+ ${pool_id}= Add ASDC Entitlement Pool ${license_model_id}
+ ${feature_group_id}= Add ASDC Feature Group ${license_model_id} ${key_group_id} ${pool_id}
+ ${license_agreement_id}= Add ASDC License Agreement ${license_model_id} ${feature_group_id}
+ Checkin ASDC License Model ${license_model_id}
+ Submit ASDC License Model ${license_model_id}
+ ${license_model_resp}= Get ASDC License Model ${license_model_id}
+ ${software_product_id}= Add ASDC Software Product ${license_agreement_id} ${feature_group_id} ${license_model_resp['vendorName']} ${license_model_id}
+ Upload ASDC Heat Package ${software_product_id} ${model_zip_path}
+ Checkin ASDC Software Product ${software_product_id}
+ Submit ASDC Software Product ${software_product_id}
+ Package ASDC Software Product ${software_product_id}
+ ${software_product_resp}= Get ASDC Software Product ${software_product_id}
+ ${catalog_resource_id}= Add ASDC Catalog Resource ${license_agreement_id} ${software_product_resp['name']} ${license_model_resp['vendorName']} ${software_product_id}
+ Checkin ASDC Catalog Resource ${catalog_resource_id}
+ Request Certify ASDC Catalog Resource ${catalog_resource_id}
+ Start Certify ASDC Catalog Resource ${catalog_resource_id}
+ # on certify it gets a new id
+ [Return] ${catalog_resource_id}
+ ${catalog_resource_id}= Certify ASDC Catalog Resource ${catalog_resource_id}
+Add ASDC License Model
+ [Documentation] Creates an asdc license model and returns its id
+ ${uuid}= Generate UUID
+ ${shortened_uuid}= Evaluate str("${uuid}")[:23]
+ ${map}= Create Dictionary vendor_name=${shortened_uuid}
+ ${data}= Fill JSON Template File ${ASDC_LICENSE_MODEL_TEMPLATE} ${map}
+ ${resp}= Run ASDC Post Request ${ASDC_VENDOR_LICENSE_MODEL_PATH} ${data}
+ Should Be Equal As Strings ${resp.status_code} 200
+ [Return] ${resp.json()['value']}
+Get ASDC License Model
+ [Documentation] gets an asdc license model by its id
+ [Arguments] ${id}
+ ${resp}= Run ASDC Get Request ${ASDC_VENDOR_LICENSE_MODEL_PATH}/${id}
+ [Return] ${resp.json()}
+Checkin ASDC License Model
+ [Documentation] checksin an asdc license model by its id
+ [Arguments] ${id}
+ ${map}= Create Dictionary action=Checkin
+ ${data}= Fill JSON Template File ${ASDC_ACTION_TEMPLATE} ${map}
+ ${resp}= Run ASDC Put Request ${ASDC_VENDOR_LICENSE_MODEL_PATH}/${id}${ASDC_VENDOR_ACTIONS_PATH} ${data}
+ Should Be Equal As Strings ${resp.status_code} 200
+ [Return] ${resp.json()}
+Submit ASDC License Model
+ [Documentation] submits an asdc license model by its id
+ [Arguments] ${id}
+ ${map}= Create Dictionary action=Submit
+ ${data}= Fill JSON Template File ${ASDC_ACTION_TEMPLATE} ${map}
+ ${resp}= Run ASDC Put Request ${ASDC_VENDOR_LICENSE_MODEL_PATH}/${id}${ASDC_VENDOR_ACTIONS_PATH} ${data}
+ Should Be Equal As Strings ${resp.status_code} 200
+ [Return] ${resp.json()}
+Checkin ASDC Software Product
+ [Documentation] checksin an asdc Software Product by its id
+ [Arguments] ${id}
+ ${map}= Create Dictionary action=Checkin
+ ${data}= Fill JSON Template File ${ASDC_ACTION_TEMPLATE} ${map}
+ ${resp}= Run ASDC Put Request ${ASDC_VENDOR_SOFTWARE_PRODUCT_PATH}/${id}${ASDC_VENDOR_ACTIONS_PATH} ${data}
+ Should Be Equal As Strings ${resp.status_code} 200
+ [Return] ${resp.json()}
+Submit ASDC Software Product
+ [Documentation] submits an asdc Software Product by its id
+ [Arguments] ${id}
+ ${map}= Create Dictionary action=Submit
+ ${data}= Fill JSON Template File ${ASDC_ACTION_TEMPLATE} ${map}
+ ${resp}= Run ASDC Put Request ${ASDC_VENDOR_SOFTWARE_PRODUCT_PATH}/${id}${ASDC_VENDOR_ACTIONS_PATH} ${data}
+ Should Be Equal As Strings ${resp.status_code} 200
+ [Return] ${resp.json()}
+Package ASDC Software Product
+ [Documentation] creates_package on an asdc Software Product by its id
+ [Arguments] ${id}
+ ${map}= Create Dictionary action=Create_Package
+ ${data}= Fill JSON Template File ${ASDC_ACTION_TEMPLATE} ${map}
+ ${resp}= Run ASDC Put Request ${ASDC_VENDOR_SOFTWARE_PRODUCT_PATH}/${id}${ASDC_VENDOR_ACTIONS_PATH} ${data}
+ Should Be Equal As Strings ${resp.status_code} 200
+ [Return] ${resp.json()}
+Add ASDC Entitlement Pool
+ [Documentation] Creates an asdc Entitlement Pool and returns its id
+ [Arguments] ${license_model_id}
+ ${uuid}= Generate UUID
+ ${shortened_uuid}= Evaluate str("${uuid}")[:23]
+ ${map}= Create Dictionary entitlement_pool_name=${shortened_uuid}
+ ${data}= Fill JSON Template File ${ASDC_ENTITLEMENT_POOL_TEMPLATE} ${map}
+ ${resp}= Run ASDC Post Request ${ASDC_VENDOR_LICENSE_MODEL_PATH}/${license_model_id}${ASDC_VENDOR_ENTITLEMENT_POOL_PATH} ${data}
+ Should Be Equal As Strings ${resp.status_code} 200
+ [Return] ${resp.json()['value']}
+Get ASDC Entitlement Pool
+ [Documentation] gets an asdc Entitlement Pool by its id
+ [Arguments] ${license_model_id} ${pool_id}
+ ${resp}= Run ASDC Get Request ${ASDC_VENDOR_LICENSE_MODEL_PATH}/${license_model_id}${ASDC_VENDOR_ENTITLEMENT_POOL_PATH}/${pool_id}
+ [Return] ${resp.json()}
+Add ASDC License Group
+ [Documentation] Creates an asdc license group and returns its id
+ [Arguments] ${license_model_id}
+ ${uuid}= Generate UUID
+ ${shortened_uuid}= Evaluate str("${uuid}")[:23]
+ ${map}= Create Dictionary key_group_name=${shortened_uuid}
+ ${data}= Fill JSON Template File ${ASDC_KEY_GROUP_TEMPLATE} ${map}
+ ${resp}= Run ASDC Post Request ${ASDC_VENDOR_LICENSE_MODEL_PATH}/${license_model_id}${ASDC_VENDOR_KEY_GROUP_PATH} ${data}
+ Should Be Equal As Strings ${resp.status_code} 200
+ [Return] ${resp.json()['value']}
+Get ASDC License Group
+ [Documentation] gets an asdc license group by its id
+ [Arguments] ${license_model_id} ${group_id}
+ ${resp}= Run ASDC Get Request ${ASDC_VENDOR_LICENSE_MODEL_PATH}/${license_model_id}${ASDC_VENDOR_KEY_GROUP_PATH}/${group_id}
+ [Return] ${resp.json()}
+Add ASDC Feature Group
+ [Documentation] Creates an asdc Feature Group and returns its id
+ [Arguments] ${license_model_id} ${key_group_id} ${entitlement_pool_id}
+ ${uuid}= Generate UUID
+ ${shortened_uuid}= Evaluate str("${uuid}")[:23]
+ ${map}= Create Dictionary feature_group_name=${shortened_uuid} key_group_id=${key_group_id} entitlement_pool_id=${entitlement_pool_id}
+ ${data}= Fill JSON Template File ${ASDC_FEATURE_GROUP_TEMPLATE} ${map}
+ ${resp}= Run ASDC Post Request ${ASDC_VENDOR_LICENSE_MODEL_PATH}/${license_model_id}${ASDC_VENDOR_FEATURE_GROUP_PATH} ${data}
+ Should Be Equal As Strings ${resp.status_code} 200
+ [Return] ${resp.json()['value']}
+Get ASDC Feature Group
+ [Documentation] gets an asdc Feature Group by its id
+ [Arguments] ${license_model_id} ${group_id}
+ ${resp}= Run ASDC Get Request ${ASDC_VENDOR_LICENSE_MODEL_PATH}/${license_model_id}${ASDC_VENDOR_FEATURE_GROUP_PATH}/${group_id}
+ [Return] ${resp.json()}
+Add ASDC License Agreement
+ [Documentation] Creates an asdc License Agreement and returns its id
+ [Arguments] ${license_model_id} ${feature_group_id}
+ ${uuid}= Generate UUID
+ ${shortened_uuid}= Evaluate str("${uuid}")[:23]
+ ${map}= Create Dictionary license_agreement_name=${shortened_uuid} feature_group_id=${feature_group_id}
+ ${data}= Fill JSON Template File ${ASDC_LICENSE_AGREEMENT_TEMPLATE} ${map}
+ ${resp}= Run ASDC Post Request ${ASDC_VENDOR_LICENSE_MODEL_PATH}/${license_model_id}${ASDC_VENDOR_LICENSE_AGREEMENT_PATH} ${data}
+ Should Be Equal As Strings ${resp.status_code} 200
+ [Return] ${resp.json()['value']}
+Get ASDC License Agreement
+ [Documentation] gets an asdc License Agreement by its id
+ [Arguments] ${license_model_id} ${agreement_id}
+ ${resp}= Run ASDC Get Request ${ASDC_VENDOR_LICENSE_MODEL_PATH}/${license_model_id}${ASDC_VENDOR_LICENSE_AGREEMENT_PATH}/${agreement_id}
+ [Return] ${resp.json()}
+Add ASDC Software Product
+ [Documentation] Creates an asdc Software Product and returns its id
+ [Arguments] ${license_agreement_id} ${feature_group_id} ${license_model_name} ${license_model_id}
+ ${uuid}= Generate UUID
+ ${shortened_uuid}= Evaluate str("${uuid}")[:23]
+ ${map}= Create Dictionary software_product_name=${shortened_uuid} feature_group_id=${feature_group_id} license_agreement_id=${license_agreement_id} vendor_name=${license_model_name} vendor_id=${license_model_id}
+ ${data}= Fill JSON Template File ${ASDC_SOFTWARE_PRODUCT_TEMPLATE} ${map}
+ ${resp}= Run ASDC Post Request ${ASDC_VENDOR_SOFTWARE_PRODUCT_PATH} ${data}
+ Should Be Equal As Strings ${resp.status_code} 200
+ [Return] ${resp.json()['vspId']}
+Get ASDC Software Product
+ [Documentation] gets an asdc Software Product by its id
+ [Arguments] ${software_product_id}
+ ${resp}= Run ASDC Get Request ${ASDC_VENDOR_SOFTWARE_PRODUCT_PATH}/${software_product_id}
+ [Return] ${resp.json()}
+Add ASDC Catalog Resource
+ [Documentation] Creates an asdc Catalog Resource and returns its id
+ [Arguments] ${license_agreement_id} ${software_product_name} ${license_model_name} ${software_product_id}
+ ${map}= Create Dictionary software_product_id=${software_product_id} software_product_name=${software_product_name} license_agreement_id=${license_agreement_id} vendor_name=${license_model_name}
+ ${data}= Fill JSON Template File ${ASDC_CATALOG_RESOURCE_TEMPLATE} ${map}
+ ${resp}= Run ASDC Post Request ${ASDC_CATALOG_RESOURCES_PATH} ${data} ${ASDC_DESIGNER_USER_ID}
+ Should Be Equal As Strings ${resp.status_code} 201
+ [Return] ${resp.json()['uniqueId']}
+Mark ASDC Catalog Resource Inactive
+ [Documentation] deletes an asdc Catalog Resource
+ [Arguments] ${catalog_resource_id}
+ ${resp}= Run ASDC Delete Request ${ASDC_CATALOG_RESOURCES_PATH}/${catalog_resource_id} ${ASDC_DESIGNER_USER_ID}
+ Should Be Equal As Strings ${resp.status_code} 204
+ [Return] ${resp}
+Delete Inactive ASDC Catalog Resources
+ [Documentation] delete all asdc Catalog Resources that are inactive
+ ${resp}= Run ASDC Delete Request ${ASDC_CATALOG_INACTIVE_RESOURCES_PATH} ${ASDC_DESIGNER_USER_ID}
+ Should Be Equal As Strings ${resp.status_code} 200
+ [Return] ${resp.json()}
+Get ASDC Catalog Resource
+ [Documentation] gets an asdc Catalog Resource by its id
+ [Arguments] ${catalog_resource_id}
+ ${resp}= Run ASDC Get Request ${ASDC_CATALOG_RESOURCES_PATH}/${catalog_resource_id} ${ASDC_DESIGNER_USER_ID}
+ [Return] ${resp.json()}
+Checkin ASDC Catalog Resource
+ [Documentation] checksin an asdc Catalog Resource by its id
+ [Arguments] ${catalog_resource_id}
+ ${map}= Create Dictionary user_remarks=Robot remarks
+ ${data}= Fill JSON Template File ${ASDC_USER_REMARKS_TEMPLATE} ${map}
+ ${resp}= Run ASDC Post Request ${ASDC_CATALOG_RESOURCES_PATH}/${catalog_resource_id}${ASDC_CATALOG_LIFECYCLE_PATH}/checkin ${data} ${ASDC_DESIGNER_USER_ID}
+ Should Be Equal As Strings ${resp.status_code} 200
+ [Return] ${resp.json()}
+Request Certify ASDC Catalog Resource
+ [Documentation] requests certify on an asdc Catalog Resource by its id
+ [Arguments] ${catalog_resource_id}
+ ${map}= Create Dictionary user_remarks=Robot remarks
+ ${data}= Fill JSON Template File ${ASDC_USER_REMARKS_TEMPLATE} ${map}
+ ${resp}= Run ASDC Post Request ${ASDC_CATALOG_RESOURCES_PATH}/${catalog_resource_id}${ASDC_CATALOG_LIFECYCLE_PATH}/certificationRequest ${data} ${ASDC_DESIGNER_USER_ID}
+ Should Be Equal As Strings ${resp.status_code} 200
+ [Return] ${resp.json()}
+Start Certify ASDC Catalog Resource
+ [Documentation] start certify an asdc Catalog Resource by its id
+ [Arguments] ${catalog_resource_id}
+ ${resp}= Run ASDC Post Request ${ASDC_CATALOG_RESOURCES_PATH}/${catalog_resource_id}${ASDC_CATALOG_LIFECYCLE_PATH}/startCertification ${None} ${ASDC_TESTER_USER_ID}
+ Should Be Equal As Strings ${resp.status_code} 200
+ [Return] ${resp.json()}
+Certify ASDC Catalog Resource
+ [Documentation] start certify an asdc Catalog Resource by its id and returns the new id
+ [Arguments] ${catalog_resource_id}
+ ${map}= Create Dictionary user_remarks=Robot remarks
+ ${data}= Fill JSON Template File ${ASDC_USER_REMARKS_TEMPLATE} ${map}
+ ${resp}= Run ASDC Post Request ${ASDC_CATALOG_RESOURCES_PATH}/${catalog_resource_id}${ASDC_CATALOG_LIFECYCLE_PATH}/certify ${data} ${ASDC_TESTER_USER_ID}
+ Should Be Equal As Strings ${resp.status_code} 200
+ [Return] ${resp.json()['uniqueId']}
+Upload ASDC Heat Package
+ [Documentation] Creates an asdc Software Product and returns its id
+ [Arguments] ${software_product_id} ${file_path}
+ ${file}= Get Binary File ${file_path}
+ ${files}= Create Dictionary upload=${file}
+ ${resp}= Run ASDC Post Files Request ${ASDC_VENDOR_SOFTWARE_PRODUCT_PATH}/${software_product_id}${ASDC_VENDOR_SOFTWARE_UPLOAD_PATH} ${files} ${ASDC_DESIGNER_USER_ID}
+ Should Be Equal As Strings ${resp.status_code} 200
+Add ASDC Catalog Service
+ [Documentation] Creates an asdc Catalog Service and returns its id
+ [Arguments] ${catalog_service_name}
+ ${uuid}= Generate UUID
+ ${shortened_uuid}= Evaluate str("${uuid}")[:23]
+ ${catalog_service_name}= Set Variable If '${catalog_service_name}' =='' ${shortened_uuid} ${catalog_service_name}
+ ${map}= Create Dictionary service_name=${catalog_service_name}
+ ${data}= Fill JSON Template File ${ASDC_CATALOG_SERVICE_TEMPLATE} ${map}
+ ${resp}= Run ASDC Post Request ${ASDC_CATALOG_SERVICES_PATH} ${data} ${ASDC_DESIGNER_USER_ID}
+ Should Be Equal As Strings ${resp.status_code} 201
+ [Return] ${resp.json()['uniqueId']}
+Mark ASDC Catalog Service Inactive
+ [Documentation] Deletes an asdc Catalog Service
+ [Arguments] ${catalog_service_id}
+ ${resp}= Run ASDC Delete Request ${ASDC_CATALOG_SERVICES_PATH}/${catalog_service_id} ${ASDC_DESIGNER_USER_ID}
+ Should Be Equal As Strings ${resp.status_code} 204
+ [Return] ${resp}
+Delete Inactive ASDC Catalog Services
+ [Documentation] delete all asdc Catalog Serivces that are inactive
+ ${resp}= Run ASDC Delete Request ${ASDC_CATALOG_INACTIVE_SERVICES_PATH} ${ASDC_DESIGNER_USER_ID}
+ Should Be Equal As Strings ${resp.status_code} 200
+ [Return] ${resp.json()}
+Get ASDC Catalog Service
+ [Documentation] gets an asdc Catalog Service by its id
+ [Arguments] ${catalog_service_id}
+ ${resp}= Run ASDC Get Request ${ASDC_CATALOG_SERVICES_PATH}/${catalog_service_id} ${ASDC_DESIGNER_USER_ID}
+ [Return] ${resp.json()}
+Checkin ASDC Catalog Service
+ [Documentation] checksin an asdc Catalog Service by its id
+ [Arguments] ${catalog_service_id}
+ ${map}= Create Dictionary user_remarks=Robot remarks
+ ${data}= Fill JSON Template File ${ASDC_USER_REMARKS_TEMPLATE} ${map}
+ ${resp}= Run ASDC Post Request ${ASDC_CATALOG_SERVICES_PATH}/${catalog_service_id}${ASDC_CATALOG_LIFECYCLE_PATH}/checkin ${data} ${ASDC_DESIGNER_USER_ID}
+ Should Be Equal As Strings ${resp.status_code} 200
+ [Return] ${resp.json()}
+Request Certify ASDC Catalog Service
+ [Documentation] requests certify on an asdc Catalog Service by its id
+ [Arguments] ${catalog_service_id}
+ ${map}= Create Dictionary user_remarks=Robot remarks
+ ${data}= Fill JSON Template File ${ASDC_USER_REMARKS_TEMPLATE} ${map}
+ ${resp}= Run ASDC Post Request ${ASDC_CATALOG_SERVICES_PATH}/${catalog_service_id}${ASDC_CATALOG_LIFECYCLE_PATH}/certificationRequest ${data} ${ASDC_DESIGNER_USER_ID}
+ Should Be Equal As Strings ${resp.status_code} 200
+ [Return] ${resp.json()}
+Start Certify ASDC Catalog Service
+ [Documentation] start certify an asdc Catalog Service by its id
+ [Arguments] ${catalog_service_id}
+ ${resp}= Run ASDC Post Request ${ASDC_CATALOG_SERVICES_PATH}/${catalog_service_id}${ASDC_CATALOG_LIFECYCLE_PATH}/startCertification ${None} ${ASDC_TESTER_USER_ID}
+ Should Be Equal As Strings ${resp.status_code} 200
+ [Return] ${resp.json()}
+Certify ASDC Catalog Service
+ [Documentation] start certify an asdc Catalog Service by its id and returns the new id
+ [Arguments] ${catalog_service_id}
+ ${map}= Create Dictionary user_remarks=Robot remarks
+ ${data}= Fill JSON Template File ${ASDC_USER_REMARKS_TEMPLATE} ${map}
+ ${resp}= Run ASDC Post Request ${ASDC_CATALOG_SERVICES_PATH}/${catalog_service_id}${ASDC_CATALOG_LIFECYCLE_PATH}/certify ${data} ${ASDC_TESTER_USER_ID}
+ Should Be Equal As Strings ${resp.status_code} 200
+ [Return] ${resp.json()['uniqueId']}
+Approve ASDC Catalog Service
+ [Documentation] approve an asdc Catalog Service by its id
+ [Arguments] ${catalog_service_id}
+ ${map}= Create Dictionary user_remarks=Robot remarks
+ ${data}= Fill JSON Template File ${ASDC_USER_REMARKS_TEMPLATE} ${map}
+ ${resp}= Run ASDC Post Request ${ASDC_CATALOG_SERVICES_PATH}/${catalog_service_id}${ASDC_CATALOG_SERVICE_DISTRIBUTION_STATE_PATH}${ASDC_DISTRIBUTION_STATE_APPROVE_PATH} ${data} ${ASDC_GOVERNOR_USER_ID}
+ Should Be Equal As Strings ${resp.status_code} 200
+ [Return] ${resp.json()}
+Distribute ASDC Catalog Service
+ [Documentation] distribute an asdc Catalog Service by its id
+ [Arguments] ${catalog_service_id}
+ ${resp}= Run ASDC Post Request ${ASDC_CATALOG_SERVICES_PATH}/${catalog_service_id}${ASDC_CATALOG_SERVICE_DISTRIBUTION_ACTIVATE_PATH} ${None} ${ASDC_OPS_USER_ID}
+ Should Be Equal As Strings ${resp.status_code} 200
+ [Return] ${resp.json()}
+Add ASDC Resource Instance
+ [Documentation] Creates an asdc Resource Instance and returns its id
+ [Arguments] ${catalog_service_id} ${catalog_resource_id} ${catalog_resource_name}
+ ${milli_timestamp}= Generate MilliTimestamp UUID
+ ${map}= Create Dictionary catalog_resource_id=${catalog_resource_id} catalog_resource_name=${catalog_resource_name} milli_timestamp=${milli_timestamp}
+ ${data}= Fill JSON Template File ${ASDC_RESOURCE_INSTANCE_TEMPLATE} ${map}
+ ${resp}= Run ASDC Post Request ${ASDC_CATALOG_SERVICES_PATH}/${catalog_service_id}${ASDC_CATALOG_SERVICE_RESOURCE_INSTANCE_PATH} ${data} ${ASDC_DESIGNER_USER_ID}
+ Should Be Equal As Strings ${resp.status_code} 201
+ [Return] ${resp.json()['uniqueId']}
+Get Catalog Service Distribution
+ [Documentation] gets an asdc catalog Service distrbution
+ [Arguments] ${catalog_service_uuid}
+ ${resp}= Run ASDC Get Request ${ASDC_CATALOG_SERVICES_PATH}/${catalog_service_uuid}${ASDC_CATALOG_SERVICE_DISTRIBUTION_PATH} ${ASDC_OPS_USER_ID}
+ Should Be Equal As Strings ${resp.status_code} 200
+ [Return] ${resp.json()}
+Check Catalog Service Distributed
+ [Documentation] gets an asdc catalog Service distrbution
+ [Arguments] ${catalog_service_uuid}
+ ${dist_resp}= Get Catalog Service Distribution ${catalog_service_uuid}
+ Should Be Equal As Strings ${dist_resp['distributionStatusOfServiceList'][0]['deployementStatus']} Distributed
+ ${det_resp}= Get Catalog Service Distribution Details ${dist_resp['distributionStatusOfServiceList'][0]['distributionID']}
+ @{ITEMS}= Copy List ${det_resp['distributionStatusList']}
+ :FOR ${ELEMENT} IN @{ITEMS}
+ \ Log ${ELEMENT['status']}
+ \ Should Match Regexp ${ELEMENT['status']} ^(DEPLOY_OK|NOTIFIED|DOWNLOAD_OK|NOT_NOTIFIED)$
+Get Catalog Service Distribution Details
+ [Documentation] gets an asdc catalog Service distrbution details
+ [Arguments] ${catalog_service_distribution_id}
+ ${resp}= Run ASDC Get Request ${ASDC_CATALOG_SERVICES_PATH}${ASDC_CATALOG_SERVICE_DISTRIBUTION_PATH}/${catalog_service_distribution_id} ${ASDC_OPS_USER_ID}
+ Should Be Equal As Strings ${resp.status_code} 200
+ [Return] ${resp.json()}
+Run ASDC Health Check
+ [Documentation] Runs a ASDC health check
+ ${session}= Create Session asdc ${GLOBAL_ASDC_FE_SERVER}:${GLOBAL_ASDC_FE_PORT}
+ ${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 asdc ${ASDC_HEALTH_CHECK_PATH} headers=${headers}
+ Should Be Equal As Strings ${resp.status_code} 200
+ @{ITEMS}= Copy List ${resp.json()['componentsInfo']}
+ :FOR ${ELEMENT} IN @{ITEMS}
+ \ Log ${ELEMENT['healthCheckStatus']}
+ \ Should Be Equal As Strings ${ELEMENT['healthCheckStatus']} UP
+Run ASDC Get Request
+ [Documentation] Runs an ASDC get request
+ [Arguments] ${data_path} ${user}=${ASDC_DESIGNER_USER_ID}
+ ${auth}= Create List ${GLOBAL_ASDC_BE_USERNAME} ${GLOBAL_ASDC_BE_PASSWORD}
+ Log Creating session ${GLOBAL_ASDC_BE_SERVER}
+ ${session}= Create Session asdc ${GLOBAL_ASDC_BE_SERVER}:${GLOBAL_ASDC_BE_PORT} auth=${auth}
+ ${uuid}= Generate UUID
+ ${headers}= Create Dictionary Accept=application/json Content-Type=application/json USER_ID=${user} X-TransactionId=${GLOBAL_APPLICATION_ID}-${uuid} X-FromAppId=${GLOBAL_APPLICATION_ID}
+ ${resp}= Get Request asdc ${data_path} headers=${headers}
+ Log Received response from asdc ${resp.text}
+ [Return] ${resp}
+Run ASDC Put Request
+ [Documentation] Runs an ASDC put request
+ [Arguments] ${data_path} ${data} ${user}=${ASDC_DESIGNER_USER_ID}
+ ${auth}= Create List ${GLOBAL_ASDC_BE_USERNAME} ${GLOBAL_ASDC_BE_PASSWORD}
+ Log Creating session ${GLOBAL_ASDC_BE_SERVER}
+ ${session}= Create Session asdc ${GLOBAL_ASDC_BE_SERVER}:${GLOBAL_ASDC_BE_PORT} auth=${auth}
+ ${uuid}= Generate UUID
+ ${headers}= Create Dictionary Accept=application/json Content-Type=application/json USER_ID=${user} X-TransactionId=${GLOBAL_APPLICATION_ID}-${uuid} X-FromAppId=${GLOBAL_APPLICATION_ID}
+ ${resp}= Put Request asdc ${data_path} data=${data} headers=${headers}
+ Log Received response from asdc ${resp.text}
+ [Return] ${resp}
+Run ASDC Post Files Request
+ [Documentation] Runs an ASDC post request
+ [Arguments] ${data_path} ${files} ${user}=${ASDC_DESIGNER_USER_ID}
+ ${auth}= Create List ${GLOBAL_ASDC_BE_USERNAME} ${GLOBAL_ASDC_BE_PASSWORD}
+ Log Creating session ${GLOBAL_ASDC_BE_SERVER}
+ ${session}= Create Session asdc ${GLOBAL_ASDC_BE_SERVER}:${GLOBAL_ASDC_BE_PORT} auth=${auth}
+ ${uuid}= Generate UUID
+ ${headers}= Create Dictionary Accept=application/json Content-Type=multipart/form-data USER_ID=${user} X-TransactionId=${GLOBAL_APPLICATION_ID}-${uuid} X-FromAppId=${GLOBAL_APPLICATION_ID}
+ ${resp}= Post Request asdc ${data_path} files=${files} headers=${headers}
+ Log Received response from asdc ${resp.text}
+ [Return] ${resp}
+Run ASDC Post Request
+ [Documentation] Runs an ASDC post request
+ [Arguments] ${data_path} ${data} ${user}=${ASDC_DESIGNER_USER_ID}
+ ${auth}= Create List ${GLOBAL_ASDC_BE_USERNAME} ${GLOBAL_ASDC_BE_PASSWORD}
+ Log Creating session ${GLOBAL_ASDC_BE_SERVER}
+ ${session}= Create Session asdc ${GLOBAL_ASDC_BE_SERVER}:${GLOBAL_ASDC_BE_PORT} auth=${auth}
+ ${uuid}= Generate UUID
+ ${headers}= Create Dictionary Accept=application/json Content-Type=application/json USER_ID=${user} X-TransactionId=${GLOBAL_APPLICATION_ID}-${uuid} X-FromAppId=${GLOBAL_APPLICATION_ID}
+ ${resp}= Post Request asdc ${data_path} data=${data} headers=${headers}
+ Log Received response from asdc ${resp.text}
+ [Return] ${resp}
+Run ASDC Delete Request
+ [Documentation] Runs an ASDC delete request
+ [Arguments] ${data_path} ${user}=${ASDC_DESIGNER_USER_ID}
+ ${auth}= Create List ${GLOBAL_ASDC_BE_USERNAME} ${GLOBAL_ASDC_BE_PASSWORD}
+ Log Creating session ${GLOBAL_ASDC_BE_SERVER}
+ ${session}= Create Session asdc ${GLOBAL_ASDC_BE_SERVER}:${GLOBAL_ASDC_BE_PORT} auth=${auth}
+ ${uuid}= Generate UUID
+ ${headers}= Create Dictionary Accept=application/json Content-Type=application/json USER_ID=${user} X-TransactionId=${GLOBAL_APPLICATION_ID}-${uuid} X-FromAppId=${GLOBAL_APPLICATION_ID}
+ ${resp}= Delete Request asdc ${data_path} headers=${headers}
+ Log Received response from asdc ${resp.text}
+ [Return] ${resp}
+Open ASDC GUI
+ [Documentation] Logs in to ASDC GUI
+ [Arguments] ${PATH}
+ ## Setup Browever now being managed by the test case
+ ##Setup Browser
+ Go To ${GLOBAL_ASDC_FE_SERVER}${PATH}
+ Maximize Browser Window
+ Set Selenium Speed ${GLOBAL_SELENIUM_DELAY}
+ Set Browser Implicit Wait ${GLOBAL_SELENIUM_BROWSER_IMPLICIT_WAIT}
+ Log Logging in to ${GLOBAL_ASDC_FE_SERVER}${PATH}
+ Title Should Be ASDC
+ Wait Until Page Contains Element xpath=//div/a[text()='SDC'] ${GLOBAL_SELENIUM_BROWSER_WAIT_TIMEOUT}
+ Log Logged in to ${GLOBAL_PORTAL_SERVER}${PATH}
diff --git a/kubernetes/config/docker/init/src/config/robot/robot/resources/browser_setup.robot b/kubernetes/config/docker/init/src/config/robot/robot/resources/browser_setup.robot
new file mode 100644
index 0000000000..6ef4f7268e
--- /dev/null
+++ b/kubernetes/config/docker/init/src/config/robot/robot/resources/browser_setup.robot
@@ -0,0 +1,43 @@
+*** Settings ***
+Documentation The main interface for interacting with VID. It handles low level stuff like managing the selenium request library and VID required steps
+Library Collections
+Library OSUtils
+Library OperatingSystem
+Library ExtendedSelenium2Library
+Resource global_properties.robot
+
+*** Variables ***
+
+*** Keywords ***
+Setup Browser
+ [Documentation] Sets up browser based upon the value of ${GLOBAL_SELENIUM_BROWSER}
+ Run Keyword If '${GLOBAL_SELENIUM_BROWSER}' == 'firefox' Setup Browser Firefox
+ Run Keyword If '${GLOBAL_SELENIUM_BROWSER}' == 'chrome' Setup Browser Chrome
+ Log Running with ${GLOBAL_SELENIUM_BROWSER}
+
+Setup Browser Firefox
+ ${dc} Evaluate sys.modules['selenium.webdriver'].DesiredCapabilities.FIREFOX sys, selenium.webdriver
+ Set To Dictionary ${dc} elementScrollBehavior 1
+ Create Webdriver Firefox desired_capabilities=${dc}
+ Set Global Variable ${GLOBAL_SELENIUM_BROWSER_CAPABILITIES} ${dc}
+
+ Setup Browser Chrome
+ ${os}= Get Normalized Os
+ Log Normalized OS=${os}
+ ${chrome options}= Evaluate sys.modules['selenium.webdriver'].ChromeOptions() sys
+ Call Method ${chrome options} add_argument no-sandbox
+ ${dc} Evaluate sys.modules['selenium.webdriver'].DesiredCapabilities.CHROME sys, selenium.webdriver
+ Set To Dictionary ${dc} elementScrollBehavior 1
+ Create Webdriver Chrome chrome_options=${chrome_options} desired_capabilities=${dc}
+ Set Global Variable ${GLOBAL_SELENIUM_BROWSER_CAPABILITIES} ${dc}
+
+Handle Proxy Warning
+ [Documentation] Handle Intermediate Warnings from Proxies
+ ${status} ${data}= Run Keyword And Ignore Error Variable Should Exist \${GLOBAL_PROXY_WARNING_TITLE}
+ Return From Keyword if '${status}' != 'PASS'
+ ${status} ${data}= Run Keyword And Ignore Error Variable Should Exist \${GLOBAL_PROXY_WARNING_CONTINUE_XPATH}
+ Return From Keyword if '${status}' != 'PASS'
+ Return From Keyword if "${GLOBAL_PROXY_WARNING_TITLE}" == ''
+ Return From Keyword if "${GLOBAL_PROXY_WARNING_CONTINUE_XPATH}" == ''
+ ${test} ${value}= Run keyword and ignore error Title Should Be ${GLOBAL_PROXY_WARNING_TITLE}
+ Run keyword If '${test}' == 'PASS' Click Element xpath=${GLOBAL_PROXY_WARNING_CONTINUE_XPATH} \ No newline at end of file
diff --git a/kubernetes/config/docker/init/src/config/robot/robot/resources/dcae_interface.robot b/kubernetes/config/docker/init/src/config/robot/robot/resources/dcae_interface.robot
new file mode 100644
index 0000000000..1c1ba44abe
--- /dev/null
+++ b/kubernetes/config/docker/init/src/config/robot/robot/resources/dcae_interface.robot
@@ -0,0 +1,57 @@
+*** Settings ***
+Documentation The main interface for interacting with DCAE. It handles low level stuff like managing the http request library and DCAE required fields
+Library RequestsLibrary
+Library UUID
+Library OperatingSystem
+Library Collections
+Resource global_properties.robot
+
+*** Variables ***
+${DCAE_HEALTH_CHECK_BODY} robot/assets/dcae/dcae_healthcheck.json
+${DCAE_HEALTH_CHECK_PATH} /gui
+
+*** Keywords ***
+Run DCAE Health Check
+ [Documentation] Runs a DCAE health check
+ ${auth}= Create List ${GLOBAL_DCAE_USERNAME} ${GLOBAL_DCAE_PASSWORD}
+ Log Creating session ${GLOBAL_DCAE_SERVER}
+ ${session}= Create Session dcae ${GLOBAL_DCAE_SERVER} auth=${auth}
+ ${uuid}= Generate UUID
+ ${data}= OperatingSystem.Get File ${DCAE_HEALTH_CHECK_BODY}
+ ${headers}= Create Dictionary action=getTable Accept=application/json Content-Type=application/json X-TransactionId=${GLOBAL_APPLICATION_ID}-${uuid} X-FromAppId=${GLOBAL_APPLICATION_ID}
+ ${resp}= Put Request dcae ${DCAE_HEALTH_CHECK_PATH} data=${data} headers=${headers}
+ Log Received response from dcae ${resp.json()}
+ Should Be Equal As Strings ${resp.status_code} 200
+ Check DCAE Results ${resp.json()}
+
+Check DCAE Results
+ [Documentation] Parse DCAE JSON response and make sure all rows have healthTestStatus=GREEN
+ [Arguments] ${json}
+ @{rows}= Get From Dictionary ${json['returns']} rows
+ @{headers}= Get From Dictionary ${json['returns']} columns
+
+ # Retrieve column names from headers
+ ${columns}= Create List
+ :for ${header} in @{headers}
+ \ ${colName}= Get From Dictionary ${header} colName
+ \ Append To List ${columns} ${colName}
+
+ # Process each row making sure status=GREEN
+ :for ${row} in @{rows}
+ \ ${cells}= Get From Dictionary ${row} cells
+ \ ${dict}= Make A Dictionary ${cells} ${columns}
+ \ Dictionary Should Contain Item ${dict} healthTestStatus GREEN
+
+
+Make A Dictionary
+ [Documentation] Given a list of column names and a list of dictionaries, map columname=value
+ [Arguments] ${columns} ${names} ${valuename}=value
+ ${dict}= Create Dictionary
+ ${collength}= Get Length ${columns}
+ ${namelength}= Get Length ${names}
+ :for ${index} in range 0 ${collength}
+ \ ${name}= Evaluate ${names}[${index}]
+ \ ${valued}= Evaluate ${columns}[${index}]
+ \ ${value}= Get From Dictionary ${valued} ${valueName}
+ \ Set To Dictionary ${dict} ${name} ${value}
+ [Return] ${dict} \ No newline at end of file
diff --git a/kubernetes/config/docker/init/src/config/robot/robot/resources/demo_preload.robot b/kubernetes/config/docker/init/src/config/robot/robot/resources/demo_preload.robot
new file mode 100644
index 0000000000..76a114ce49
--- /dev/null
+++ b/kubernetes/config/docker/init/src/config/robot/robot/resources/demo_preload.robot
@@ -0,0 +1,202 @@
+*** Settings ***
+Documentation This test template encapsulates the VNF Orchestration use case.
+
+Resource test_templates/model_test_template.robot
+Resource test_templates/vnf_orchestration_test_template.robot
+Resource asdc_interface.robot
+
+Library UUID
+Library Collections
+Library OperatingSystem
+Library HttpLibrary.HTTP
+Library ExtendedSelenium2Library
+Library RequestsLibrary
+
+*** Variables ***
+
+${ADD_DEMO_CUSTOMER_BODY} robot/assets/templates/aai/add_demo_customer.template
+${AAI_INDEX_PATH} /aai/v8
+${VF_MODULES_NAME} _Demo_VFModules.json
+${FILE_CACHE} /share/
+
+*** Keywords ***
+Load Customer And Models
+ [Documentation] Use openECOMP to Orchestrate a service.
+ [Arguments] ${customer_name}
+ Load Customer ${customer_name}
+ Load Models ${customer_name}
+
+Load Customer
+ [Documentation] Use openECOMP to Orchestrate a service.
+ [Arguments] ${customer_name}
+ Setup Orchestrate VNF ${GLOBAL_AAI_CLOUD_OWNER} SharedNode OwnerType v1 CloudZone
+ Set Test Variable ${CUSTOMER_NAME} ${customer_name}
+ ${region}= Get Openstack Region
+ Create Customer For VNF Demo ${CUSTOMER_NAME} ${CUSTOMER_NAME} INFRA ${GLOBAL_AAI_CLOUD_OWNER} ${region} ${TENANT_ID}
+
+Load Models
+ [Documentation] Use openECOMP to Orchestrate a service.
+ [Arguments] ${customer_name}
+ Set Test Variable ${CUSTOMER_NAME} ${customer_name}
+ ${status} ${value}= Run Keyword And Ignore Error Distribute Model vFW demoVFW
+ ${status} ${value}= Run Keyword And Ignore Error Distribute Model vLB demoVLB
+
+Distribute Model
+ [Arguments] ${service} ${modelName}
+ ${service_model_type} ${vnf_type} ${vf_modules}= Model Distribution For Directory ${service} ${modelName}
+
+Create Customer For VNF Demo
+ [Documentation] Create demo customer for the demo
+ [Arguments] ${customer_name} ${customer_id} ${customer_type} ${clouder_owner} ${cloud_region_id} ${tenant_id}
+ ${data_template}= OperatingSystem.Get File ${ADD_DEMO_CUSTOMER_BODY}
+ ${arguments}= Create Dictionary subscriber_name=${customer_name} global_customer_id=${customer_id} subscriber_type=${customer_type} cloud_owner=${clouder_owner} cloud_region_id=${cloud_region_id} tenant_id=${tenant_id}
+ Set To Dictionary ${arguments} service1=vFW service2=vLB
+ ${data}= Fill JSON Template ${data_template} ${arguments}
+ ${put_resp}= Run A&AI Put Request ${INDEX PATH}${ROOT_CUSTOMER_PATH}${customer_id} ${data}
+ ${status_string}= Convert To String ${put_resp.status_code}
+ Should Match Regexp ${status_string} ^(201|412)$
+ Create Service If Not Exists vFW
+ Create Service If Not Exists vLB
+
+Preload User Model
+ [Documentation] Preload the demo data for the passed VNF with the passed module name
+ [Arguments] ${vnf_name} ${vf_module_name}
+ # Go to A&AI and get information about the VNF we need to preload
+ ${status} ${generic_vnf}= Run Keyword And Ignore Error Get Service Instance ${vnf_name}
+ Run Keyword If '${status}' == 'FAIL' FAIL VNF Name: ${vnf_name} is not found.
+ ${vnf_type}= Set Variable ${generic_vnf['vnf-type']}
+ ${relationships}= Set Variable ${generic_vnf['relationship-list']['relationship']}
+ ${relationship_data}= Get Relationship Data ${relationships}
+ ${customer_id}= Catenate
+ :for ${r} in @{relationship_data}
+ \ ${service}= Set Variable If '${r['relationship-key']}' == 'service-subscription.service-type' ${r['relationship-value']} ${service}
+ \ ${service_instance_id}= Set Variable If '${r['relationship-key']}' == 'service-instance.service-instance-id' ${r['relationship-value']} ${service_instance_id}
+ \ ${customer_id}= Set Variable If '${r['relationship-key']}' == 'customer.global-customer-id' ${r['relationship-value']} ${customer_id}
+ ${invariantUUID}= Get Persona Model Id ${service_instance_id} ${service} ${customer_id}
+
+ # We still need the vf module names. We can get them from VID using the persona_model_id (invariantUUID) from A&AI
+ Setup Browser
+ Login To VID GUI
+ ${vf_modules}= Get Module Names from VID ${invariantUUID}
+ Log ${generic_vnf}
+ Log ${service_instance_id},${vnf_name},${vnf_type},${vf_module_name},${vf_modules},${service}
+ Preload Vnf ${service_instance_id} ${vnf_name} ${vnf_type} ${vf_module_name} ${vf_modules} ${service} demo
+ [Teardown] Close All Browsers
+
+
+Get Relationship Data
+ [Arguments] ${relationships}
+ :for ${r} in @{relationships}
+ \ ${status} ${relationship_data} Run Keyword And Ignore Error Set Variable ${r['relationship-data']}
+ \ Return From Keyword If '${status}' == 'PASS' ${relationship_data}
+
+
+Get Service Instance
+ [Arguments] ${vnf_name}
+ ${resp}= Run A&AI Get Request ${AAI_INDEX PATH}/network/generic-vnfs/generic-vnf?vnf-name=${vnf_name}
+ Should Be Equal As Strings ${resp.status_code} 200
+ [Return] ${resp.json()}
+
+Get Persona Model Id
+ [Documentation] Query and Validates A&AI Service Instance
+ [Arguments] ${service_instance_id} ${service_type} ${customer_id}
+ ${resp}= Run A&AI Get Request ${INDEX PATH}${CUSTOMER SPEC PATH}${customer_id}${SERVICE SUBSCRIPTIONS}${service_type}${SERVICE INSTANCE}${service_instance_id}
+ ${persona_model_id}= Get From DIctionary ${resp.json()['service-instance'][0]} persona-model-id
+ [Return] ${persona_model_id}
+
+
+Get Model UUID from VID
+ [Documentation] Must use UI since rest call get redirect to portal and get DNS error
+ ... Search all services and match on the invariantUUID
+ [Arguments] ${invariantUUID}
+ Go To ${GLOBAL_VID_SERVER}${VID_ENV}/rest/models/services
+ ${resp}= Get Text xpath=//body/pre
+ ${json}= To Json ${resp}
+ :for ${dict} in @{json}
+ \ ${uuid}= Get From DIctionary ${dict} uuid
+ \ ${inv}= Get From DIctionary ${dict} invariantUUID
+ \ Return From Keyword If "${invariantUUID}" == "${inv}" ${uuid}
+ [Return] ""
+
+
+Get Module Names from VID
+ [Documentation] Must use UI since rest call get redirect to portal and get DNS error
+ ... Given the invariantUUID of the model, mock up the vf_modules list passed to Preload VNF
+ [Arguments] ${invariantUUID}
+ ${id}= Get Model UUID from VID ${invariantUUID}
+ Go To ${GLOBAL_VID_SERVER}${VID_ENV}/rest/models/services/${id}
+ ${resp}= Get Text xpath=//body/pre
+ ${json}= To Json ${resp}
+ ${modules}= Create List
+ ${vnfs}= Get From Dictionary ${json} vnfs
+ ${keys}= Get Dictionary Keys ${vnfs}
+ :for ${key} in @{keys}
+ \ Add VFModule ${vnfs['${key}']} ${modules}
+ [Return] ${modules}
+
+Add VFModule
+ [Documentation] Dig the vf module names from the VID service model
+ [Arguments] ${vnf} ${modules}
+ ${vfModules}= Get From Dictionary ${vnf} vfModules
+ ${keys}= Get Dictionary Keys ${vfModules}
+ :for ${key} in @{keys}
+ \ ${module}= Get From Dictionary ${vfModules} ${key}
+ \ ${dict}= Create Dictionary name=${module['name']}
+ \ Append to List ${modules} ${dict}
+
+
+
+
+
+
+APPC Mount Point
+ [Arguments] ${vf_module_name}
+ Run Openstack Auth Request auth
+ ${status} ${stack_info}= Run Keyword and Ignore Error Wait for Stack to Be Deployed auth ${vf_module_name} timeout=120s
+ Run Keyword if '${status}' == 'FAIL' FAIL ${vf_module_name} Stack is not found
+ ${stack_id}= Get From Dictionary ${stack_info} id
+ ${server_list}= Get Openstack Servers auth
+ ${vpg_name_0}= Get From Dictionary ${stack_info} vpg_name_0
+ ${vpg_public_ip}= Get Server Ip ${server_list} ${stack_info} vpg_name_0 network_name=public
+ ${vpg_oam_ip}= Get From Dictionary ${stack_info} vpg_private_ip_1
+ ${appc}= Create Mount Point In APPC ${vpg_name_0} ${vpg_oam_ip}
+
+Instantiate VNF
+ [Arguments] ${service}
+ Setup Orchestrate VNF ${GLOBAL_AAI_CLOUD_OWNER} SharedNode OwnerType v1 CloudZone
+ ${vf_module_name} ${service}= Orchestrate VNF DemoCust ${service} ${service} ${TENANT_NAME}
+ Save For Delete
+ Log to Console Customer Name=${CUSTOMER_NAME}
+ Log to Console VNF Module Name=${vf_module_name}
+
+Save For Delete
+ [Documentation] Create a variable file to be loaded for save for delete
+ ${dict}= Create Dictionary
+ Set To Dictionary ${dict} TENANT_NAME=${TENANT_NAME}
+ Set To Dictionary ${dict} TENANT_ID=${TENANT_ID}
+ Set To Dictionary ${dict} CUSTOMER_NAME=${CUSTOMER_NAME}
+ Set To Dictionary ${dict} STACK_NAME=${STACK_NAME}
+ Set To Dictionary ${dict} SERVICE=${SERVICE}
+ Set To Dictionary ${dict} VVG_SERVER_ID=${VVG_SERVER_ID}
+ Set To Dictionary ${dict} SERVICE_INSTANCE_ID=${SERVICE_INSTANCE_ID}
+
+ Set To Dictionary ${dict} VLB_CLOSED_LOOP_DELETE=${VLB_CLOSED_LOOP_DELETE}
+ Set To Dictionary ${dict} VLB_CLOSED_LOOP_VNF_ID=${VLB_CLOSED_LOOP_VNF_ID}
+
+ Set To Dictionary ${dict} CATALOG_SERVICE_ID=${CATALOG_SERVICE_ID}
+
+ ${vars}= Catenate
+ ${keys}= Get Dictionary Keys ${dict}
+ :for ${key} in @{keys}
+ \ ${value}= Get From Dictionary ${dict} ${key}
+ \ ${vars}= Catenate ${vars}${key} = "${value}"\n
+
+ ${comma}= Catenate
+ ${vars}= Catenate ${vars}CATALOG_RESOURCE_IDS = [
+ :for ${id} in @{CATALOG_RESOURCE_IDS}
+ \ ${vars}= Catenate ${vars}${comma} "${id}"
+ \ ${comma}= Catenate ,
+ ${vars}= Catenate ${vars}]\n
+ OperatingSystem.Create File ${FILE_CACHE}/${STACK_NAME}.py ${vars}
+
+
diff --git a/kubernetes/config/docker/init/src/config/robot/robot/resources/global_properties.robot b/kubernetes/config/docker/init/src/config/robot/robot/resources/global_properties.robot
new file mode 100644
index 0000000000..953f528358
--- /dev/null
+++ b/kubernetes/config/docker/init/src/config/robot/robot/resources/global_properties.robot
@@ -0,0 +1,23 @@
+*** Settings ***
+Documentation store all properties that can change or are used in multiple places here
+... format is all caps with underscores between words and prepended with 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} /ecomp/mso/infra/orchestrationRequests/v2/
+${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_AAI_CLOUD_OWNER} Rackspace
+${GLOBAL_BUILD_NUMBER} 0
+${GLOBAL_VM_PRIVATE_KEY} ${EXECDIR}/robot/assets/keys/robot_ssh_private_key.pvt \ No newline at end of file
diff --git a/kubernetes/config/docker/init/src/config/robot/robot/resources/heatbridge.robot b/kubernetes/config/docker/init/src/config/robot/robot/resources/heatbridge.robot
new file mode 100644
index 0000000000..3ddeff1163
--- /dev/null
+++ b/kubernetes/config/docker/init/src/config/robot/robot/resources/heatbridge.robot
@@ -0,0 +1,130 @@
+*** Settings ***
+Library HeatBridge
+Library Collections
+Library StringTemplater
+Library OperatingSystem
+Library UUID
+
+Resource openstack/keystone_interface.robot
+Resource openstack/heat_interface.robot
+Resource openstack/nova_interface.robot
+Resource openstack/neutron_interface.robot
+Resource aai/aai_interface.robot
+
+*** Variables ***
+${MULTIPART_PATH} /bulkadd
+${NAMED_QUERY_PATH} /aai/search/named-query
+${NAMED_QUERY_TEMPLATE} robot/assets/templates/aai/named_query.template
+
+${BASE_URI} /cloud-infrastructure/cloud-regions/cloud-region/\${cloud}/\${region}
+${IMAGE_URI} ${BASE_URI}/images/image/\${image_id}
+${FLAVOR_URI} ${BASE_URI}/flavors/flavor/\${flavor}
+${VSERVER_URI} ${BASE_URI}/tenants/tenant/\${tenant}/vservers/vserver/\${vserver_id}
+${L_INTERFACE_URI} ${VSERVER_URI}/l-interfaces/l-interface/\${linterface_id}
+
+#******************** Test Case Variables ****************
+${REVERSE_HEATBRIDGE}
+
+
+*** Keywords ***
+Execute Heatbridge
+ [Documentation] Run the Heatbridge against the stack to generate the bulkadd message
+ ... Execute the build add
+ ... Validate the add results by running the named query
+ [Arguments] ${stack_name} ${service_instance_id} ${service}
+ Return From Keyword If '${service}' == 'vVG'
+ Run Openstack Auth Request auth
+ ${stack_info}= Wait for Stack to Be Deployed auth ${stack_name}
+ ${stack_id}= Get From Dictionary ${stack_info} id
+ ${tenant_id}= Get From Dictionary ${stack_info} OS::project_id
+ ${vnf_id}= Get From Dictionary ${stack_info} vnf_id
+ ${openstack_identity_url}= Catenate ${GLOBAL_OPENSTACK_KEYSTONE_SERVER}/v2.0
+ ${region}= Get Openstack Region
+ ${user} ${pass}= Get Openstack Credentials
+ Init Bridge ${openstack_identity_url} ${user} ${pass} ${tenant_id} ${region} ${GLOBAL_AAI_CLOUD_OWNER}
+ ${request}= Bridge Data ${stack_id}
+ Log ${request}
+ ${resp}= Run A&AI Put Request ${VERSIONED_INDEX_PATH}${MULTIPART_PATH} ${request}
+ ${status_string}= Convert To String ${resp.status_code}
+ Should Match Regexp ${status_string} ^(201|200)$
+ ${reverse_heatbridge}= Generate Reverse Heatbridge From Stack Info ${stack_info}
+ Set Test Variable ${REVERSE_HEATBRIDGE} ${reverse_heatbridge}
+ Run Validation Query ${stack_info} ${service}
+
+
+Run Validation Query
+ [Documentation] Run A&AI query to validate the bulk add
+ [Arguments] ${stack_info} ${service}
+ Return from Keyword If '${service}' == ''
+ ${server_name_parameter}= Get From Dictionary ${GLOBAL_VALIDATE_NAME_MAPPING} ${service}
+ ${vserver_name}= Get From Dictionary ${stack_info} ${server_name_parameter}
+ Run Vserver Query ${vserver_name}
+
+Run Vserver Query
+ [Documentation] Run A&AI query to validate the bulk add
+ [Arguments] ${vserver_name}
+ ${dict}= Create Dictionary vserver_name=${vserver_name}
+ ${request}= OperatingSystem.Get File ${NAMED_QUERY_TEMPLATE}
+ ${request}= Template String ${request} ${dict}
+ ${resp}= Run A&AI Post Request ${NAMED_QUERY_PATH} ${request}
+ Should Be Equal As Strings ${resp.status_code} 200
+
+
+Execute Reverse Heatbridge
+ [Documentation] VID has already torn down the stack, reverse HB
+ Return From Keyword If len(${REVERSE_HEATBRIDGE}) == 0
+ :for ${uri} in @{REVERSE_HEATBRIDGE}
+ \ Run Keyword And Ignore Error Delete A&AI Entity ${uri}
+
+Generate Reverse Heatbridge From Stack Name
+ [Arguments] ${stack_name}
+ Run Openstack Auth Request auth
+ ${stack_info}= Wait for Stack to Be Deployed auth ${stack_name} timeout=10s
+ ${reverse_heatbridge}= Generate Reverse Heatbridge From Stack Info ${stack_info}
+ [Return] ${reverse_heatbridge}
+
+Generate Reverse Heatbridge From Stack Info
+ [Arguments] ${stack_info}
+ ${reverse_heatbridge}= Create List
+ ${stack_name}= Get From Dictionary ${stack_info} name
+ ${stack_id}= Get From Dictionary ${stack_info} id
+ ${tenant_id}= Get From Dictionary ${stack_info} OS::project_id
+ ${region}= Get Openstack Region
+ ${keys}= Create Dictionary region=${region} cloud=${GLOBAL_AAI_CLOUD_OWNER} tenant=${tenant_id}
+ ${stack_resources}= Get Stack Resources auth ${stack_name} ${stack_id}
+ ${resource_list}= Get From Dictionary ${stack_resources} resources
+ :FOR ${resource} in @{resource_list}
+ \ Log ${resource}
+ \ Run Keyword If '${resource['resource_type']}' == 'OS::Neutron::Port' Generate Linterface Uri auth ${resource['physical_resource_id']} ${reverse_heatbridge} ${keys}
+ :FOR ${resource} in @{resource_list}
+ \ Log ${resource}
+ \ Run Keyword If '${resource['resource_type']}' == 'OS::Nova::Server' Generate Vserver Uri auth ${resource['physical_resource_id']} ${reverse_heatbridge} ${keys} ${resource_list}
+ [Return] ${reverse_heatbridge}
+
+Generate Vserver Uri
+ [Documentation] Run teardown against the server to generate a message that removes it
+ [Arguments] ${alias} ${port_id} ${reverse_heatbridge} ${keys} ${resource_list}
+ ${resp}= Get Openstack Server By Id ${alias} ${port_id}
+ Return From Keyword If '${resp.status_code}' != '200'
+ ${info}= Set Variable ${resp.json()}
+ Set To Dictionary ${keys} vserver_id=${info['server']['id']}
+ Set To Dictionary ${keys} flavor=${info['server']['flavor']['id']}
+ Set To Dictionary ${keys} image_id=${info['server']['image']['id']}
+ ${uri}= Template String ${VSERVER_URI} ${keys}
+ Append To List ${reverse_heatbridge} ${uri}
+ ${uri}= Template String ${FLAVOR_URI} ${keys}
+ Append To List ${reverse_heatbridge} ${uri}
+ ${uri}= Template String ${IMAGE_URI} ${keys}
+ Append To List ${reverse_heatbridge} ${uri}
+
+Generate Linterface Uri
+ [Documentation] Run teardown against the server to generate a message that removes it
+ [Arguments] ${alias} ${server_id} ${reverse_heatbridge} ${keys}
+ ${resp}= Get Openstack Port By Id ${alias} ${server_id}
+ Return From Keyword If '${resp.status_code}' != '200'
+ ${info}= Set Variable ${resp.json()}
+ Set To Dictionary ${keys} vserver_id=${info['port']['device_id']}
+ Set To Dictionary ${keys} linterface_id=${info['port']['name']}
+ ${uri}= Template String ${L_INTERFACE_URI} ${keys}
+ Append To List ${reverse_heatbridge} ${uri}
+
diff --git a/kubernetes/config/docker/init/src/config/robot/robot/resources/json_templater.robot b/kubernetes/config/docker/init/src/config/robot/robot/resources/json_templater.robot
new file mode 100644
index 0000000000..6a5ca17190
--- /dev/null
+++ b/kubernetes/config/docker/init/src/config/robot/robot/resources/json_templater.robot
@@ -0,0 +1,21 @@
+*** Settings ***
+Documentation This resource is filling out json string templates and returning the json back
+Library RequestsLibrary
+Library StringTemplater
+Library OperatingSystem
+Resource global_properties.robot
+
+*** Keywords ***
+Fill JSON Template
+ [Documentation] Runs substitution on template to return a filled in json
+ [Arguments] ${json} ${arguments}
+ ${returned_string}= Template String ${json} ${arguments}
+ ${returned_json}= To Json ${returned_string}
+ [Return] ${returned_json}
+
+Fill JSON Template File
+ [Documentation] Runs substitution on template to return a filled in json
+ [Arguments] ${json_file} ${arguments}
+ ${json}= OperatingSystem.Get File ${json_file}
+ ${returned_json}= Fill JSON Template ${json} ${arguments}
+ [Return] ${returned_json} \ No newline at end of file
diff --git a/kubernetes/config/docker/init/src/config/robot/robot/resources/mr_interface.robot b/kubernetes/config/docker/init/src/config/robot/robot/resources/mr_interface.robot
new file mode 100644
index 0000000000..11c9348f15
--- /dev/null
+++ b/kubernetes/config/docker/init/src/config/robot/robot/resources/mr_interface.robot
@@ -0,0 +1,28 @@
+*** Settings ***
+Documentation The main interface for interacting with Message router. It handles low level stuff like managing the http request library and message router required fields
+Library RequestsClientCert
+Library RequestsLibrary
+Library UUID
+
+Resource global_properties.robot
+
+*** Variables ***
+${MR_HEALTH_CHECK_PATH} /topics
+
+*** Keywords ***
+Run MR Health Check
+ [Documentation] Runs MR Health check
+ ${resp}= Run MR Get Request ${MR_HEALTH_CHECK_PATH}
+ Should Be Equal As Strings ${resp.status_code} 200
+ Should Contain ${resp.json()} topics
+
+Run MR Get Request
+ [Documentation] Runs MR Get request
+ [Arguments] ${data_path}
+ ${session}= Create Session mr ${GLOBAL_MR_SERVER}
+ ${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 mr ${data_path} headers=${headers}
+ Log Received response from message router ${resp.text}
+ [Return] ${resp}
+
diff --git a/kubernetes/config/docker/init/src/config/robot/robot/resources/mso_interface.robot b/kubernetes/config/docker/init/src/config/robot/robot/resources/mso_interface.robot
new file mode 100644
index 0000000000..b6a53b4090
--- /dev/null
+++ b/kubernetes/config/docker/init/src/config/robot/robot/resources/mso_interface.robot
@@ -0,0 +1,54 @@
+*** Settings ***
+Documentation The main interface for interacting with MSO. It handles low level stuff like managing the http request library and MSO required fields
+Library RequestsLibrary
+Library UUID
+Library OperatingSystem
+Library Collections
+Resource global_properties.robot
+Resource ../resources/json_templater.robot
+*** Variables ***
+${MSO_HEALTH_CHECK_PATH} /ecomp/mso/infra/globalhealthcheck
+
+*** Keywords ***
+Run MSO Health Check
+ [Documentation] Runs an MSO global health check
+ ${auth}= Create List ${GLOBAL_MSO_USERNAME} ${GLOBAL_MSO_PASSWORD}
+ ${session}= Create Session mso ${GLOBAL_MSO_SERVER}
+ ${uuid}= Generate UUID
+ ${headers}= Create Dictionary Accept=text/html Content-Type=text/html X-TransactionId=${GLOBAL_APPLICATION_ID}-${uuid} X-FromAppId=${GLOBAL_APPLICATION_ID}
+ ${resp}= Get Request mso ${MSO_HEALTH_CHECK_PATH} headers=${headers}
+ Should Be Equal As Strings ${resp.status_code} 200
+
+Run MSO Get Request
+ [Documentation] Runs an MSO get request
+ [Arguments] ${data_path} ${accept}=application/json
+ ${auth}= Create List ${GLOBAL_MSO_USERNAME} ${GLOBAL_MSO_PASSWORD}
+ Log Creating session ${GLOBAL_MSO_SERVER}
+ ${session}= Create Session mso ${GLOBAL_MSO_SERVER} auth=${auth}
+ ${uuid}= Generate UUID
+ ${headers}= Create Dictionary Accept=${accept} Content-Type=application/json X-TransactionId=${GLOBAL_APPLICATION_ID}-${uuid} X-FromAppId=${GLOBAL_APPLICATION_ID}
+ ${resp}= Get Request mso ${data_path} headers=${headers}
+ Log Received response from mso ${resp.text}
+ [Return] ${resp}
+
+Poll MSO Get Request
+ [Documentation] Runs an MSO get request until a certain status is received. valid values are COMPLETE
+ [Arguments] ${data_path} ${status}
+ ${auth}= Create List ${GLOBAL_MSO_USERNAME} ${GLOBAL_MSO_PASSWORD}
+ Log Creating session ${GLOBAL_MSO_SERVER}
+ ${session}= Create Session mso ${GLOBAL_MSO_SERVER} 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}
+ #do this until it is done
+ :FOR ${i} IN RANGE 20
+ \ ${resp}= Get Request mso ${data_path} headers=${headers}
+ \ Should Not Contain ${resp.text} FAILED
+ \ Log ${resp.json()['request']['requestStatus']['requestState']}
+ \ ${exit_loop}= Evaluate "${resp.json()['request']['requestStatus']['requestState']}" == "${status}"
+ \ Exit For Loop If ${exit_loop}
+ \ Sleep 15s
+ Log Received response from mso ${resp.text}
+ [Return] ${resp}
+
+
+
diff --git a/kubernetes/config/docker/init/src/config/robot/robot/resources/openstack/cinder_interface.robot b/kubernetes/config/docker/init/src/config/robot/robot/resources/openstack/cinder_interface.robot
new file mode 100644
index 0000000000..1b7203597c
--- /dev/null
+++ b/kubernetes/config/docker/init/src/config/robot/robot/resources/openstack/cinder_interface.robot
@@ -0,0 +1,50 @@
+*** Settings ***
+Documentation The main interface for interacting with Openstack. It handles low level stuff like managing the authtoken and Openstack required fields
+Library OpenstackLibrary
+Library RequestsLibrary
+Library UUID
+Library OperatingSystem
+Resource ../global_properties.robot
+Resource ../json_templater.robot
+Resource openstack_common.robot
+
+
+*** Variables ***
+${OPENSTACK_CINDER_API_VERSION} /v1
+${OPENSTACK_CINDER_TYPES_PATH} /types
+${OPENSTACK_CINDER_VOLUMES_PATH} /volumes
+${OPENSTACK_CINDER_VOLUMES_ADD_BODY_FILE} robot/assets/templates/cinder_add_volume.template
+${OPENSTACK_CINDER_VOLUMES_TYPE} SSD
+${OPENSTACK_CINDER_AVAILABILITY_ZONE} nova
+
+*** Keywords ***
+Get Openstack Volume Types
+ [Documentation] Returns the openstack volume types information
+ [Arguments] ${alias}
+ ${resp}= Internal Get Openstack ${alias} ${GLOBAL_OPENSTACK_CINDER_SERVICE_TYPE} ${OPENSTACK_CINDER_TYPES_PATH}
+ [Return] ${resp.json()}
+
+Get Openstack Volume
+ [Documentation] Returns the openstack volume information for the passed in volume id
+ [Arguments] ${alias} ${volume_id}
+ ${resp}= Internal Get Openstack ${alias} ${GLOBAL_OPENSTACK_CINDER_SERVICE_TYPE} ${OPENSTACK_CINDER_VOLUMES_PATH} /${volume_id}
+ [Return] ${resp.json()}
+
+Add Openstack Volume
+ [Documentation] Runs an Openstack Request to add a volume and returns that volume id of the created volume
+ [Arguments] ${alias} ${name} ${size}
+ ${data_template}= OperatingSystem.Get File ${OPENSTACK_CINDER_VOLUMES_ADD_BODY_FILE}
+ ${uuid}= Generate UUID
+ ${arguments}= Create Dictionary name=${name} description=${GLOBAL_APPLICATION_ID}${uuid} size=${size} type=${OPENSTACK_CINDER_VOLUMES_TYPE} availability_zone=${OPENSTACK_CINDER_AVAILABILITY_ZONE}
+ ${data}= Fill JSON Template ${data_template} ${arguments}
+ ${resp}= Internal Post Openstack ${alias} ${GLOBAL_OPENSTACK_CINDER_SERVICE_TYPE} ${OPENSTACK_CINDER_VOLUMES_PATH} data_path= data=${data}
+ Should Be Equal As Strings 200 ${resp.status_code}
+ [Return] ${resp.json()['volume']['id']}
+
+Delete Openstack Volume
+ [Documentation] Runs an Openstack Request to delete a volume
+ [Arguments] ${alias} ${volume_id}
+ ${resp}= Internal Delete Openstack ${alias} ${GLOBAL_OPENSTACK_CINDER_SERVICE_TYPE} ${OPENSTACK_CINDER_VOLUMES_PATH} /${volume_id}
+ ${status_string}= Convert To String ${resp.status_code}
+ Should Match Regexp ${status_string} ^(204|200|404)$
+ [Return] ${resp.text} \ No newline at end of file
diff --git a/kubernetes/config/docker/init/src/config/robot/robot/resources/openstack/heat_interface.robot b/kubernetes/config/docker/init/src/config/robot/robot/resources/openstack/heat_interface.robot
new file mode 100644
index 0000000000..32f3fdee02
--- /dev/null
+++ b/kubernetes/config/docker/init/src/config/robot/robot/resources/openstack/heat_interface.robot
@@ -0,0 +1,92 @@
+*** Settings ***
+Documentation The interface for interacting with Openstack Heat API.
+Library OpenstackLibrary
+Library RequestsLibrary
+Library UUID
+Library OperatingSystem
+Library HEATUtils
+Library StringTemplater
+Library Collections
+Resource ../global_properties.robot
+Resource ../json_templater.robot
+Resource openstack_common.robot
+
+*** Variables ***
+${OPENSTACK_HEAT_API_VERSION} /v1
+${OPENSTACK_HEAT_STACK_PATH} /stacks
+${OPENSTACK_HEAT_ADD_STACK_TEMPLATE} robot/assets/templates/heat_add_stack.template
+
+
+*** Keywords ***
+Get Openstack Stacks
+ [Documentation] Returns the openstack stacks info
+ [Arguments] ${alias}
+ ${resp}= Internal Get Openstack ${alias} ${GLOBAL_OPENSTACK_HEAT_SERVICE_TYPE} ${OPENSTACK_HEAT_STACK_PATH}
+ [Return] ${resp.json()}
+
+Get Openstack Stack
+ [Documentation] Returns the openstack stacks info for the given stack name
+ [Arguments] ${alias} ${stack_name}
+ ${resp}= Internal Get Openstack ${alias} ${GLOBAL_OPENSTACK_HEAT_SERVICE_TYPE} ${OPENSTACK_HEAT_STACK_PATH} /${stack_name}
+ [Return] ${resp.json()}
+
+Create Openstack Stack
+ [Documentation] Takes an openstack heat yaml and returns the created stack
+ [Arguments] ${alias} ${request}
+ ${resp}= Internal Post Openstack ${alias} ${GLOBAL_OPENSTACK_HEAT_SERVICE_TYPE} ${OPENSTACK_HEAT_STACK_PATH} data_path= data=${request}
+ [Return] ${resp.json()}
+
+Make Add Stack Request
+ [Documentation] Makes a JSON Add Stack Request from YAML template and env files
+ [Arguments] ${name} ${template} ${env}
+ ${templatedata}= Template Yaml To Json ${template}
+ ${envdata}= Env Yaml To Json ${env}
+ ${dict}= Create Dictionary template=${templatedata} parameters=${envdata} stack_name=${name}
+ ${resp}= OperatingSystem.Get File ${OPENSTACK_HEAT_ADD_STACK_TEMPLATE}
+ ${request}= Template String ${resp} ${dict}
+ Log $request
+ [Return] ${request}
+
+Delete Openstack Stack
+ [Documentation] Deletes and Openstack Stack for the passed name and id
+ [Arguments] ${alias} ${stack_name} ${stack_id}
+ ${data_path}= Catenate /${stack_name}/${stack_id}
+ ${resp}= Internal Delete Openstack ${alias} ${GLOBAL_OPENSTACK_HEAT_SERVICE_TYPE} ${OPENSTACK_HEAT_STACK_PATH} data_path=${data_path}
+ Should Be Equal As Strings 204 ${resp.status_code}
+ [Return] ${resp}
+
+Get Stack Details
+ [Documentation] Gets all of the information necessary for tearing down an existing Openstack Stack
+ [Arguments] ${alias} ${stack_name}
+ ${resp}= Internal Get Openstack ${alias} ${GLOBAL_OPENSTACK_HEAT_SERVICE_TYPE} ${OPENSTACK_HEAT_STACK_PATH} /${stack_name}
+ ${result}= Stack Info Parse ${resp.json()}
+ [Return] ${result}
+
+Get Stack Template
+ [Documentation] Gets all of the template information of an existing Openstack Stack
+ [Arguments] ${alias} ${stack_name} ${stack_id}
+ ${data_path}= Catenate /${stack_name}/${stack_id}/template
+ ${resp}= Internal Get Openstack ${alias} ${GLOBAL_OPENSTACK_HEAT_SERVICE_TYPE} ${OPENSTACK_HEAT_STACK_PATH} ${data_path}
+ ${template}= Catenate ${resp.json()}
+ [Return] ${template}
+
+Get Stack Resources
+ [Documentation] Gets all of the resources of an existing Openstack Stack
+ [Arguments] ${alias} ${stack_name} ${stack_id}
+ ${data_path}= Catenate /${stack_name}/${stack_id}/resources
+ ${resp}= Internal Get Openstack ${alias} ${GLOBAL_OPENSTACK_HEAT_SERVICE_TYPE} ${OPENSTACK_HEAT_STACK_PATH} ${data_path}
+ [Return] ${resp.json()}
+
+Wait for Stack to Be Deployed
+ [Arguments] ${alias} ${stack_name} ${timeout}=600s
+ ${stack_info}= Wait Until Keyword Succeeds ${timeout} 30 sec Get Deployed Stack ${alias} ${stack_name}
+ ${status}= Get From Dictionary ${stack_info} stack_status
+ Should Be Equal ${status} CREATE_COMPLETE
+ [Return] ${stack_info}
+
+Get Deployed Stack
+ [Arguments] ${alias} ${stack_name}
+ ${stack_info}= Get Stack Details ${alias} ${stack_name}
+ ${status}= Get From Dictionary ${stack_info} stack_status
+ Should Not Be Equal ${status} CREATE_IN_PROGRESS
+ [Return] ${stack_info}
diff --git a/kubernetes/config/docker/init/src/config/robot/robot/resources/openstack/keystone_interface.robot b/kubernetes/config/docker/init/src/config/robot/robot/resources/openstack/keystone_interface.robot
new file mode 100644
index 0000000000..6c48e12086
--- /dev/null
+++ b/kubernetes/config/docker/init/src/config/robot/robot/resources/openstack/keystone_interface.robot
@@ -0,0 +1,55 @@
+*** Settings ***
+Documentation The main interface for interacting with Openstack Keystone API. It handles low level stuff like managing the authtoken and Openstack required fields
+Library OpenstackLibrary
+Library RequestsLibrary
+Library UUID
+Library Collections
+Library OperatingSystem
+Resource ../global_properties.robot
+Resource ../json_templater.robot
+Resource openstack_common.robot
+
+*** Variables ***
+${OPENSTACK_KEYSTONE_API_VERSION} /v2.0
+${OPENSTACK_KEYSTONE_AUTH_PATH} /tokens
+${OPENSTACK_KEYSTONE_AUTH_BODY_FILE} robot/assets/templates/keystone_get_auth.template
+${OPENSTACK_KEYSTONE_TENANT_PATH} /tenants
+
+*** Keywords ***
+Run Openstack Auth Request
+ [Documentation] Runs an Openstack Auth Request and returns the token and service catalog. you need to include the token in future request's x-auth-token headers. Service catalog describes what can be called
+ [Arguments] ${alias} ${username}= ${password}=
+ ${username} ${password}= Set Openstack Credentials ${username} ${password}
+ ${session}= Create Session keystone ${GLOBAL_OPENSTACK_KEYSTONE_SERVER} verify=True
+ ${uuid}= Generate UUID
+ ${data_template}= OperatingSystem.Get File ${OPENSTACK_KEYSTONE_AUTH_BODY_FILE}
+ ${arguments}= Create Dictionary username=${username} password=${password}
+ ${data}= Fill JSON Template ${data_template} ${arguments}
+ ${data_path}= Catenate ${OPENSTACK_KEYSTONE_API_VERSION}${OPENSTACK_KEYSTONE_AUTH_PATH}
+ ${headers}= Create Dictionary Accept=application/json Content-Type=application/json X-TransactionId=${GLOBAL_APPLICATION_ID}-${uuid} X-FromAppId=${GLOBAL_APPLICATION_ID}
+ Log Sending authenticate post request ${data_path} with headers ${headers} and data ${data}
+ ${resp}= Post Request keystone ${data_path} data=${data} headers=${headers}
+ Save Openstack Auth ${alias} ${resp.text}
+ Log Received response from keystone ${resp.text}
+
+Get Openstack Tenants
+ [Documentation] Returns all the openstack tenant info
+ [Arguments] ${alias}
+ ${resp}= Internal Get Openstack With Region ${alias} ${GLOBAL_OPENSTACK_KEYSTONE_SERVICE_TYPE} region= url_ext=${OPENSTACK_KEYSTONE_TENANT_PATH} data_path=
+ [Return] ${resp.json()}
+
+Get Openstack Tenant
+ [Documentation] Returns the openstack tenant info for the specified tenantid
+ [Arguments] ${alias} ${tenant_id}
+ ${resp}= Internal Get Openstack With Region ${alias} ${GLOBAL_OPENSTACK_KEYSTONE_SERVICE_TYPE} region= url_ext=${OPENSTACK_KEYSTONE_TENANT_PATH} data_path=/${tenant_id}
+ [Return] ${resp.json()}
+
+Set Openstack Credentials
+ [Arguments] ${username} ${password}
+ Return From Keyword If '${username}' != '' ${username} ${password}
+ ${user} ${pass}= Get Openstack Credentials
+ [Return] ${user} ${pass}
+
+Get Openstack Credentials
+ Dictionary Should Contain Key ${GLOBAL_VM_PROPERTIES} openstack_username
+ [Return] ${GLOBAL_VM_PROPERTIES['openstack_username']} ${GLOBAL_VM_PROPERTIES['openstack_password']} \ No newline at end of file
diff --git a/kubernetes/config/docker/init/src/config/robot/robot/resources/openstack/neutron_interface.robot b/kubernetes/config/docker/init/src/config/robot/robot/resources/openstack/neutron_interface.robot
new file mode 100644
index 0000000000..bdb64b986c
--- /dev/null
+++ b/kubernetes/config/docker/init/src/config/robot/robot/resources/openstack/neutron_interface.robot
@@ -0,0 +1,128 @@
+*** Settings ***
+Documentation The main interface for interacting with Openstack. It handles low level stuff like managing the authtoken and Openstack required fields
+Library OpenstackLibrary
+Library RequestsLibrary
+Library UUID
+Library OperatingSystem
+Library Collections
+Resource ../global_properties.robot
+Resource ../json_templater.robot
+Resource openstack_common.robot
+
+*** Variables ***
+${OPENSTACK_NEUTRON_API_VERSION} /v2.0
+${OPENSTACK_NEUTRON_NETWORK_PATH} /networks
+${OPENSTACK_NEUTRON_NETWORK_ADD_BODY_FILE} robot/assets/templates/neutron_add_network.template
+${OPENSTACK_NEUTRON_SUBNET_PATH} /subnets
+${OPENSTACK_NEUTRON_SUBNET_ADD_BODY_FILE} robot/assets/templates/neutron_add_subnet.template
+${OPENSTACK_NEUTRON_PORT_PATH} /ports
+
+*** Keywords ***
+Get Openstack Network
+ [Documentation] Runs an Openstack Request and returns the network info
+ [Arguments] ${alias} ${network_id}
+ ${resp}= Internal Get Openstack ${alias} ${GLOBAL_OPENSTACK_NEUTRON_SERVICE_TYPE} ${OPENSTACK_NEUTRON_NETWORK_PATH} /${network_id}
+ [Return] ${resp.json()}
+
+Get Openstack Networks
+ [Documentation] Runs an Openstack Request and returns the network info
+ [Arguments] ${alias}
+ ${resp}= Internal Get Openstack ${alias} ${GLOBAL_OPENSTACK_NEUTRON_SERVICE_TYPE} ${OPENSTACK_NEUTRON_NETWORK_PATH}
+ [Return] ${resp.json()}
+
+Get Openstack Subnets
+ [Documentation] Runs an Openstack Request and returns the network info
+ [Arguments] ${alias}
+ ${resp}= Internal Get Openstack ${alias} ${GLOBAL_OPENSTACK_NEUTRON_SERVICE_TYPE} ${OPENSTACK_NEUTRON_SUBNET_PATH}
+ [Return] ${resp.json()}
+
+Get Openstack Ports
+ [Documentation] Runs an Openstack Request and returns the network info
+ [Arguments] ${alias}
+ ${resp}= Internal Get Openstack ${alias} ${GLOBAL_OPENSTACK_NEUTRON_SERVICE_TYPE} ${OPENSTACK_NEUTRON_PORT_PATH}
+ [Return] ${resp.json()}
+
+Add Openstack Network
+ [Documentation] Runs an Openstack Request to add a network and returns that network id of the created network
+ [Arguments] ${alias} ${name}
+ ${data_template}= OperatingSystem.Get File ${OPENSTACK_NEUTRON_NETWORK_ADD_BODY_FILE}
+ ${arguments}= Create Dictionary name=${name}
+ ${data}= Fill JSON Template ${data_template} ${arguments}
+ ${resp}= Internal Post Openstack ${alias} ${GLOBAL_OPENSTACK_NEUTRON_SERVICE_TYPE} ${OPENSTACK_NEUTRON_NETWORK_PATH} data_path= data=${data}
+ Should Be Equal As Strings 201 ${resp.status_code}
+ [Return] ${resp.json()['network']['id']}
+
+Delete Openstack Network
+ [Documentation] Runs an Openstack Request to delete a network
+ [Arguments] ${alias} ${network_id}
+ ${resp}= Internal Delete Openstack ${alias} ${GLOBAL_OPENSTACK_NEUTRON_SERVICE_TYPE} ${OPENSTACK_NEUTRON_NETWORK_PATH} /${network_id}
+ ${status_string}= Convert To String ${resp.status_code}
+ Should Match Regexp ${status_string} ^(204|200)$
+ [Return] ${resp.text}
+
+Add Openstack Network With Subnet If Not Exists
+ [Documentation] Runs an Openstack Request to add a network and returns that network id of the created network
+ [Arguments] ${alias} ${name} ${cidr}
+ ${network}= Get Openstack Subnet By Name ${alias} ${name} ${cidr}
+ ${pass} ${v}= Run Keyword and Ignore Error Dictionary Should Contain Key ${network} id
+ Run Keyword If '${pass}' == 'FAIL' Add Openstack Network With Subnet ${alias} ${name} ${cidr}
+ ${network}= Get Openstack Subnet By Name ${alias} ${name} ${cidr}
+ ${network_id}= Get From Dictionary ${network} id
+ [Return] ${network_id}
+
+
+Add Openstack Network With Subnet
+ [Documentation] Runs an Openstack Request to add a network and returns that network id of the created network
+ [Arguments] ${alias} ${name} ${cidr}
+ ${network_id}= Add Openstack Network ${alias} ${name}
+ ${data_template}= OperatingSystem.Get File ${OPENSTACK_NEUTRON_SUBNET_ADD_BODY_FILE}
+ ${arguments}= Create Dictionary network_id=${network_id} cidr=${cidr} subnet_name=${name}
+ ${data}= Fill JSON Template ${data_template} ${arguments}
+ ${resp}= Internal Post Openstack ${alias} ${GLOBAL_OPENSTACK_NEUTRON_SERVICE_TYPE} ${OPENSTACK_NEUTRON_SUBNET_PATH} data_path= data=${data}
+ Should Be Equal As Strings 201 ${resp.status_code}
+ [Return] ${network_id}
+
+Get Openstack Subnet By Name
+ [Documentation] Retrieve the subnet from openstack by it's name.
+ [Arguments] ${alias} ${network_name} ${network_cidr}
+ ${resp}= Get Openstack Subnets ${alias}
+ @{list}= Get From Dictionary ${resp} subnets
+ ${returnnet}= Set Variable
+ :for ${net} in @{list}
+ \ ${name}= Get From Dictionary ${net} name
+ \ ${cidr}= Get From Dictionary ${net} cidr
+ \ ${returnnet}= Set Variable ${net}
+ \ Exit For Loop If '${name}'=='${network_name}' and '${cidr}'=='${network_cidr}'
+ \ ${returnnet}= Create DIctionary
+ [Return] ${returnnet}
+
+Get Openstack IP By Name
+ [Arguments] ${alias} ${network_name} ${cidr} ${ip}
+ ${ports}= Get Openstack Ports For Subnet ${alias} ${network_name} ${cidr}
+ Log ${ports}
+ :for ${port} in @{ports}
+ \ Return From Keyword If '${port['fixed_ips'][0]['ip_address']}' == '${ip}' ${port}
+ [Return] None
+
+Get Openstack Ports For Subnet
+ [Arguments] ${alias} ${network_name} ${cidr}
+ ${net}= Get Openstack Subnet By Name ${alias} ${network_name} ${cidr}
+ ${ports}= Get Openstack Ports ${alias}
+ ${net_ports}= Create List
+ :for ${port} in @{ports['ports']}
+ \ Run Keyword If '${net['network_id']}' == '${port['network_id']}' Append To List ${net_ports} ${port}
+ [Return] ${net_ports}
+
+Get Openstack Port By Id
+ [Arguments] ${alias} ${port_id}
+ ${resp}= Internal Get Openstack ${alias} ${GLOBAL_OPENSTACK_NEUTRON_SERVICE_TYPE} ${OPENSTACK_NEUTRON_PORT_PATH}/${port_id}
+ [Return] ${resp}
+
+
+Delete Openstack Port
+ [Arguments] ${alias} ${port_id}
+ ${resp}= Internal Delete Openstack ${alias} ${GLOBAL_OPENSTACK_NEUTRON_SERVICE_TYPE} ${OPENSTACK_NEUTRON_PORT_PATH} /${port_id}
+ ${status_string}= Convert To String ${resp.status_code}
+ Should Match Regexp ${status_string} ^(204|200)$
+ [Return] ${resp.text}
+
diff --git a/kubernetes/config/docker/init/src/config/robot/robot/resources/openstack/nova_interface.robot b/kubernetes/config/docker/init/src/config/robot/robot/resources/openstack/nova_interface.robot
new file mode 100644
index 0000000000..b36d09f1e6
--- /dev/null
+++ b/kubernetes/config/docker/init/src/config/robot/robot/resources/openstack/nova_interface.robot
@@ -0,0 +1,149 @@
+*** Settings ***
+Documentation The main interface for interacting with Openstack. It handles low level stuff like managing the authtoken and Openstack required fields
+Library OpenstackLibrary
+Library RequestsLibrary
+Library JSONUtils
+Library UUID
+Library OperatingSystem
+Library Collections
+Resource ../global_properties.robot
+Resource ../json_templater.robot
+Resource openstack_common.robot
+
+*** Variables ***
+${OPENSTACK_NOVA_API_VERSION} /v2
+${OPENSTACK_NOVA_KEYPAIR_PATH} /os-keypairs
+${OPENSTACK_NOVA_KEYPAIR_ADD_BODY_FILE} robot/assets/templates/nova_add_keypair.template
+${OPENSTACK_NOVA_KEYPAIR_SSH_KEY} robot/assets/keys/robot_ssh_public_key.txt
+${OPENSTACK_NOVA_FLAVORS_PATH} /flavors
+${OPENSTACK_NOVA_SERVERS_PATH} /servers
+${OPENSTACK_NOVA_IMAGES_PATH} /images
+${OPENSTACK_NOVA_SERVERS_REBOOT_BODY} {"reboot" : { "type" : "SOFT" }}
+${OPENSTACK_NOVA_SERVER_ADD_BODY_FILE} robot/assets/templates/nova_add_server.template
+
+
+*** Keywords ***
+Get Openstack Keypair
+ [Documentation] Runs an Openstack Request and returns the keypair info
+ [Arguments] ${alias} ${keypair_name}
+ ${resp}= Internal Get Openstack ${alias} ${GLOBAL_OPENSTACK_NOVA_SERVICE_TYPE} ${OPENSTACK_NOVA_KEYPAIR_PATH} /${keypair_name}
+ [Return] ${resp.json()}
+
+Add Openstack Keypair
+ [Documentation] Runs an Openstack Request to add a keypair and returns the keypair name
+ [Arguments] ${alias} ${name}
+ ${data_template}= OperatingSystem.Get File ${OPENSTACK_NOVA_KEYPAIR_ADD_BODY_FILE}
+ ${ssh_key}= OperatingSystem.Get File ${OPENSTACK_NOVA_KEYPAIR_SSH_KEY}
+ ${arguments}= Create Dictionary name=${name} publickey=${ssh_key}
+ ${data}= Fill JSON Template ${data_template} ${arguments}
+ ${resp}= Internal Post Openstack ${alias} ${GLOBAL_OPENSTACK_NOVA_SERVICE_TYPE} ${OPENSTACK_NOVA_KEYPAIR_PATH} data_path= data=${data}
+ Should Be Equal As Strings 200 ${resp.status_code}
+ [Return] ${resp.json()['keypair']['name']}
+
+Delete Openstack Keypair
+ [Documentation] Runs an Openstack Request to delete a keypair
+ [Arguments] ${alias} ${keypair_name}
+ ${resp}= Internal Delete Openstack ${alias} ${GLOBAL_OPENSTACK_NOVA_SERVICE_TYPE} ${OPENSTACK_NOVA_KEYPAIR_PATH} /${keypair_name}
+ ${status_string}= Convert To String ${resp.status_code}
+ Should Match Regexp ${status_string} ^(204|202|200)$
+ [Return] ${resp.text}
+
+
+Get Openstack Servers
+ [Documentation] Returns the list of servers as a dictionary by name
+ [Arguments] ${alias}
+ ${resp}= Internal Get Openstack ${alias} ${GLOBAL_OPENSTACK_NOVA_SERVICE_TYPE} ${OPENSTACK_NOVA_SERVERS_PATH} /detail
+ Log Returned from Internal Get Openstack
+ ${by_name}= Make List Into Dict ${resp.json()['servers']} name
+ Log got it
+ [Return] ${by_name}
+
+Get Openstack Server By Id
+ [Documentation] Returns the openstack stacks info for the given stack name
+ [Arguments] ${alias} ${server_id}
+ ${resp}= Internal Get Openstack ${alias} ${GLOBAL_OPENSTACK_NOVA_SERVICE_TYPE} ${OPENSTACK_NOVA_SERVERS_PATH} /${server_id}
+ [Return] ${resp}
+
+Get Openstack Flavors
+ [Documentation] Runs an Openstack Request and returns the flavor list
+ [Arguments] ${alias}
+ ${resp}= Internal Get Openstack ${alias} ${GLOBAL_OPENSTACK_NOVA_SERVICE_TYPE} ${OPENSTACK_NOVA_FLAVORS_PATH}
+ [Return] ${resp.json()}
+
+Get Openstack Images
+ [Documentation] Runs an Openstack Request and returns the flavor list
+ [Arguments] ${alias}
+ ${resp}= Internal Get Openstack ${alias} ${GLOBAL_OPENSTACK_NOVA_SERVICE_TYPE} ${OPENSTACK_NOVA_IMAGES_PATH}
+ [Return] ${resp.json()}
+
+Reboot Server
+ [Documentation] Requests a reboot of the passed server id
+ [Arguments] ${alias} ${server_id}
+ ${resp}= Internal Post Openstack ${alias} ${GLOBAL_OPENSTACK_NOVA_SERVICE_TYPE} ${OPENSTACK_NOVA_SERVERS_PATH} /${server_id}/action ${OPENSTACK_NOVA_SERVERS_REBOOT_BODY}
+ [Return] ${resp}
+
+Add Server
+ [Documentation] Adds a server for the passed if
+ [Arguments] ${alias} ${name} ${imageRef} ${flavorRef}
+ ${dict}= Create Dictionary name=${name} imageRef=${imageRef} flavorRef=${flavorRef}
+ ${data}= Fill JSON Template File ${OPENSTACK_NOVA_SERVER_ADD_BODY_FILE} ${dict}
+ ${resp}= Internal Post Openstack ${alias} ${GLOBAL_OPENSTACK_NOVA_SERVICE_TYPE} ${OPENSTACK_NOVA_SERVERS_PATH} data_path= data=${data}
+ [Return] ${resp}
+
+Add Server For Image Name
+ [Documentation] Adds a server for the passed if
+ [Arguments] ${alias} ${name} ${imageName} ${flavorName}
+ ${images}= Get Openstack Images ${alias}
+ ${flavors}= Get Openstack Flavors ${alias}
+ ${images}= Get From Dictionary ${images} images
+ ${flavors}= Get From Dictionary ${flavors} flavors
+ ${imageRef}= Get Id For Name ${images} ${imageName}
+ ${flavorRef}= Get Id For Name ${flavors} ${flavorName}
+ ${dict}= Create Dictionary name=${name} imageRef=${imageRef} flavorRef=${flavorRef}
+ ${data}= Fill JSON Template File ${OPENSTACK_NOVA_SERVER_ADD_BODY_FILE} ${dict}
+ ${resp}= Internal Post Openstack ${alias} ${GLOBAL_OPENSTACK_NOVA_SERVICE_TYPE} ${OPENSTACK_NOVA_SERVERS_PATH} data_path= data=${data}
+ ${status_string}= Convert To String ${resp.status_code}
+ Should Match Regexp ${status_string} ^(202)$
+ [Return] ${resp.json()}
+
+Wait for Server to Be Active
+ [Arguments] ${alias} ${server_id} ${timeout}=300s
+ ${server_info}= Wait Until Keyword Succeeds ${timeout} 10 sec Get Active Server ${alias} ${server_id}
+ ${status}= Get From Dictionary ${server_info} status
+ Should Be Equal ${status} ACTIVE
+ [Return] ${server_info}
+
+ Get Active Server
+ [Arguments] ${alias} ${server_id}
+ ${resp}= Get Openstack Server By Id ${alias} ${server_id}
+ Should Be Equal As Strings ${resp.status_code} 200
+ ${server_info}= Set Variable ${resp.json()}
+ ${server_info}= Get From Dictionary ${server_info} server
+ ${status}= Get From Dictionary ${server_info} status
+ Should Not Be Equal ${status} BUILD
+ [Return] ${server_info}
+
+Wait for Server to Be Deleted
+ [Arguments] ${alias} ${server_id}
+ Wait Until Keyword Succeeds 300s 10s Get Deleted Server ${alias} ${server_id}
+
+Get Deleted Server
+ [Arguments] ${alias} ${server_id}
+ ${resp}= Get Openstack Server By Id ${alias} ${server_id}
+ Should Be Equal As Strings ${resp.status_code} 404
+
+Delete Server
+ [Documentation] Runs an Openstack Request to delete a keypair
+ [Arguments] ${alias} ${server_id}
+ ${resp}= Internal Delete Openstack ${alias} ${GLOBAL_OPENSTACK_NOVA_SERVICE_TYPE} ${OPENSTACK_NOVA_SERVERS_PATH} /${server_id}
+ ${status_string}= Convert To String ${resp.status_code}
+ Should Match Regexp ${status_string} ^(204)$
+ [Return] ${resp.text}
+
+Get Id For Name
+ [Arguments] ${list} ${name}
+ :for ${item} in @{list}
+ \ ${id}= Get From Dictionary ${item} id
+ \ ${n}= Get From Dictionary ${item} name
+ \ Return from Keyword If '${n}' == '${name}' ${id}
+ [Return] None
diff --git a/kubernetes/config/docker/init/src/config/robot/robot/resources/openstack/openstack_common.robot b/kubernetes/config/docker/init/src/config/robot/robot/resources/openstack/openstack_common.robot
new file mode 100644
index 0000000000..ef370c66ba
--- /dev/null
+++ b/kubernetes/config/docker/init/src/config/robot/robot/resources/openstack/openstack_common.robot
@@ -0,0 +1,80 @@
+*** Settings ***
+Documentation The private interface for interacting with Openstack. It handles low level stuff like managing the authtoken and Openstack required fields
+
+Library Collections
+Library OpenstackLibrary
+Library RequestsLibrary
+Library UUID
+Resource ../global_properties.robot
+
+*** Variables ***
+#**************** Test Case Variables ******************
+${OPENSTACK_SERVICE_REGION}
+
+*** Keywords ***
+Internal Get Openstack
+ [Documentation] Runs an Openstack Get Request and returns the response
+ [Arguments] ${alias} ${service_type} ${url_ext} ${data_path}=
+ ${region}= Get Openstack Region
+ ${resp}= Internal Get Openstack With Region ${alias} ${service_type} ${region} ${url_ext} ${data_path}
+ [Return] ${resp}
+
+Internal Get Openstack With Region
+ [Documentation] Runs an Openstack Get Request and returns the response
+ [Arguments] ${alias} ${service_type} ${region} ${url_ext} ${data_path}=
+ Log Internal Get Openstack values alias=${alias} service_type=${service_type} region=${region} url_ext=${url_ext} data_path=${data_path}
+ ${url}= Get Openstack Service Url ${alias} ${service_type} ${region}
+ ${uuid}= Generate UUID
+ ${session_alias}= Catenate openstack-${uuid}
+ ${session}= Create Session ${session_alias} ${url}${url_ext} verify=True
+ ${token}= Get Openstack Token ${alias}
+ ${headers}= Create Dictionary Accept=application/json Content-Type=application/json X-TransactionId=${GLOBAL_APPLICATION_ID}-${uuid} X-FromAppId=${GLOBAL_APPLICATION_ID} X-Auth-Token=${token}
+ ${resp}= Get Request ${session_alias} ${data_path} headers=${headers}
+ Log Received response from openstack ${resp.text}
+ [Return] ${resp}
+
+Internal Post Openstack
+ [Documentation] Runs an Openstack Post Response and returns the response
+ [Arguments] ${alias} ${service_type} ${url_ext} ${data_path}= ${data}=
+ ${region}= Get Openstack Region
+ Log Internal Post Openstack values alias=${alias} service_type=${service_type} region=${region} url_ext=${url_ext} data_path=${data_path}
+ ${url}= Get Openstack Service Url ${alias} ${service_type} ${region}
+ ${uuid}= Generate UUID
+ ${session_alias}= Catenate openstack-${uuid}
+ ${session}= Create Session ${session_alias} ${url}${url_ext} verify=True
+ ${token}= Get Openstack Token ${alias}
+ ${headers}= Create Dictionary Accept=application/json Content-Type=application/json X-TransactionId=${GLOBAL_APPLICATION_ID}-${uuid} X-FromAppId=${GLOBAL_APPLICATION_ID} X-Auth-Token=${token}
+ ${resp}= Post Request ${session_alias} ${data_path} data=${data} headers=${headers}
+ Log Received response from openstack ${resp.text}
+ [Return] ${resp}
+
+Internal Delete Openstack
+ [Documentation] Runs an Openstack Delete Request and returns the response
+ [Arguments] ${alias} ${service_type} ${url_ext} ${data_path}=
+ ${region}= Get Openstack Region
+ Log Internal Post Openstack values alias=${alias} service_type=${service_type} region=${region} url_ext=${url_ext} data_path=${data_path}
+ ${url}= Get Openstack Service Url ${alias} ${service_type} ${region}
+ ${uuid}= Generate UUID
+ ${session_alias}= Catenate openstack-${uuid}
+ ${session}= Create Session ${session_alias} ${url}${url_ext} verify=True
+ ${token}= Get Openstack Token ${alias}
+ ${headers}= Create Dictionary Accept=application/json Content-Type=application/json X-TransactionId=${GLOBAL_APPLICATION_ID}-${uuid} X-FromAppId=${GLOBAL_APPLICATION_ID} X-Auth-Token=${token}
+ ${resp}= Delete Request ${session_alias} ${data_path} headers=${headers}
+ Log Received response from openstack ${resp.text}
+ [Return] ${resp}
+
+Get Openstack Region
+ [Documentation] Returns the current openstack region test variable
+ ... Defaults to the openstack region of the Robot VM
+ Return From Keyword If len('${OPENSTACK_SERVICE_REGION}') > 0 ${OPENSTACK_SERVICE_REGION}
+ Dictionary Should Contain Key ${GLOBAL_VM_PROPERTIES} region
+ Set Test Variable ${OPENSTACK_SERVICE_REGION} ${GLOBAL_VM_PROPERTIES['region']}
+ Log Setting OPENSTACK_SERVICE_REGION=${OPENSTACK_SERVICE_REGION}
+ [Return] ${OPENSTACK_SERVICE_REGION}
+
+Set Openstack Region Test Variable
+ [Documentation] Sets the openstack service region of the current test case
+ ... To be used to override the service region of the Robot VM (default)
+ [Arguments] ${openstack_service_region}
+ Set Test Variable ${OPENSTACK_SERVICE_REGION} ${openstack_service_region}
+
diff --git a/kubernetes/config/docker/init/src/config/robot/robot/resources/policy_interface.robot b/kubernetes/config/docker/init/src/config/robot/robot/resources/policy_interface.robot
new file mode 100644
index 0000000000..3bd51f5a43
--- /dev/null
+++ b/kubernetes/config/docker/init/src/config/robot/robot/resources/policy_interface.robot
@@ -0,0 +1,58 @@
+*** Settings ***
+Documentation The main interface for interacting with Policy. It handles low level stuff like managing the http request library and Policy required fields
+Library RequestsClientCert
+Library RequestsLibrary
+Library String
+Library JSONUtils
+Library Collections
+Resource global_properties.robot
+
+*** Variables ***
+${POLICY_HEALTH_CHECK_PATH} /healthcheck
+
+*** Keywords ***
+
+Run Policy Health Check
+ [Documentation] Runs Policy Health check
+ ${auth}= Create List ${GLOBAL_POLICY_USERNAME} ${GLOBAL_POLICY_PASSWORD}
+ Log Creating session ${GLOBAL_POLICY_SERVER_URL}
+ ${session}= Create Session policy ${GLOBAL_POLICY_HEALTHCHECK_URL} auth=${auth}
+ ${headers}= Create Dictionary Accept=application/json Content-Type=application/json
+ ${resp}= Get Request policy ${POLICY_HEALTH_CHECK_PATH} headers=${headers}
+ Log Received response from policy ${resp.text}
+ Should Be Equal As Strings ${resp.status_code} 200
+ Should Be True ${resp.json()['healthy']}
+ @{ITEMS}= Copy List ${resp.json()['details']}
+ :FOR ${ELEMENT} IN @{ITEMS}
+ \ Should Be Equal As Strings ${ELEMENT['code']} 200
+ \ Should Be True ${ELEMENT['healthy']}
+
+Run Policy Put Request
+ [Documentation] Runs Policy Put request
+ [Arguments] ${data_path} ${data}
+ Log Creating session ${GLOBAL_POLICY_SERVER_URL}
+ ${session}= Create Session policy ${GLOBAL_POLICY_SERVER_URL}
+ ${headers}= Create Dictionary Accept=application/json Content-Type=application/json Authorization=Basic ${GLOBAL_POLICY_AUTH} ClientAuth=${GLOBAL_POLICY_CLIENTAUTH} Environment=TEST
+ ${resp}= Put Request policy ${data_path} data=${data} headers=${headers}
+ Log Received response from policy ${resp.text}
+ [Return] ${resp}
+
+Run Policy Delete Request
+ [Documentation] Runs Policy Delete request
+ [Arguments] ${data_path} ${data}
+ Log Creating session ${GLOBAL_POLICY_SERVER_URL}
+ ${session}= Create Session policy ${GLOBAL_POLICY_SERVER_URL}
+ ${headers}= Create Dictionary Accept=application/json Content-Type=application/json Authorization=Basic ${GLOBAL_POLICY_AUTH} ClientAuth=${GLOBAL_POLICY_CLIENTAUTH} Environment=TEST
+ ${resp}= Delete Request policy ${data_path} data=${data} headers=${headers}
+ Log Received response from policy ${resp.text}
+ [Return] ${resp}
+
+Run Policy Get Configs Request
+ [Documentation] Runs Policy Get Configs request
+ [Arguments] ${data_path} ${data}
+ Log Creating session ${GLOBAL_POLICY_SERVER_URL}
+ ${session}= Create Session policy ${GLOBAL_POLICY_SERVER_URL}
+ ${headers}= Create Dictionary Accept=application/json Content-Type=application/json Authorization=Basic ${GLOBAL_POLICY_AUTH} ClientAuth=${GLOBAL_POLICY_CLIENTAUTH}
+ ${resp}= Post Request policy ${data_path} data=${data} headers=${headers}
+ Log Received response from policy ${resp.text}
+ [Return] ${resp} \ No newline at end of file
diff --git a/kubernetes/config/docker/init/src/config/robot/robot/resources/portal_interface.robot b/kubernetes/config/docker/init/src/config/robot/robot/resources/portal_interface.robot
new file mode 100644
index 0000000000..7d53b3780f
--- /dev/null
+++ b/kubernetes/config/docker/init/src/config/robot/robot/resources/portal_interface.robot
@@ -0,0 +1,28 @@
+*** Settings ***
+Documentation The main interface for interacting with Portal. It handles low level stuff like managing the http request library and Portal required fields
+Library RequestsClientCert
+Library RequestsLibrary
+Library UUID
+
+Resource global_properties.robot
+
+*** Variables ***
+${PORTAL_HEALTH_CHECK_PATH} /ECOMPPORTAL/portalApi/healthCheck
+
+*** Keywords ***
+Run Portal Health Check
+ [Documentation] Runs Portal Health check
+ ${resp}= Run Portal Get Request ${PORTAL_HEALTH_CHECK_PATH}
+ Should Be Equal As Strings ${resp.status_code} 200
+ Should Be Equal As Strings ${resp.json()['statusCode']} 200
+
+Run Portal Get Request
+ [Documentation] Runs Portal Get request
+ [Arguments] ${data_path}
+ ${session}= Create Session portal ${GLOBAL_PORTAL_SERVER}
+ ${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 portal ${data_path} headers=${headers}
+ Log Received response from portal ${resp.text}
+ [Return] ${resp}
+
diff --git a/kubernetes/config/docker/init/src/config/robot/robot/resources/sdngc_interface.robot b/kubernetes/config/docker/init/src/config/robot/robot/resources/sdngc_interface.robot
new file mode 100644
index 0000000000..0d4f10e35b
--- /dev/null
+++ b/kubernetes/config/docker/init/src/config/robot/robot/resources/sdngc_interface.robot
@@ -0,0 +1,203 @@
+*** Settings ***
+Documentation The main interface for interacting with SDN-GC. It handles low level stuff like managing the http request library and SDN-GC required fields
+Library RequestsLibrary
+Library UUID
+Library OperatingSystem
+Library ExtendedSelenium2Library
+Library Collections
+Library String
+Library StringTemplater
+Resource global_properties.robot
+Resource ../resources/json_templater.robot
+Resource browser_setup.robot
+
+Variables ../assets/service_mappings.py
+
+*** Variables ***
+${PRELOAD_VNF_TOPOLOGY_OPERATION_PATH} /operations/VNF-API:preload-vnf-topology-operation
+${PRELOAD_VNF_CONFIG_PATH} /config/VNF-API:preload-vnfs/vnf-preload-list
+${PRELOAD_VNF_TOPOLOGY_OPERATION_BODY} robot/assets/templates/sdnc/
+${SDNGC_INDEX_PATH} /restconf
+${SDNCGC_HEALTHCHECK_OPERATION_PATH} /operations/SLI-API:healthcheck
+${SDNGC_REST_ENDPOINT} ${GLOBAL_SDNGC_SERVER}:${GLOBAL_SDNGC_REST_PORT}
+${SDNGC_ADMIN_ENDPOINT} ${GLOBAL_SDNGC_PORTAL}:${GLOBAL_SDNGC_ADMIN_PORT}
+${SDNGC_ADMIN_SIGNUP_URL} ${SDNGC_ADMIN_ENDPOINT}/signup
+${SDNGC_ADMIN_LOGIN_URL} ${SDNGC_ADMIN_ENDPOINT}/login
+${SDNGC_ADMIN_VNF_PROFILE_URL} ${SDNGC_ADMIN_ENDPOINT}/mobility/getVnfProfile
+
+*** Keywords ***
+Run SDNGC Health Check
+ [Documentation] Runs an SDNGC healthcheck
+ ${resp}= Run SDNGC Post Request ${SDNGC_INDEX PATH}${SDNCGC_HEALTHCHECK_OPERATION_PATH} ${None}
+ Should Be Equal As Strings ${resp.status_code} 200
+ Should Be Equal As Strings ${resp.json()['output']['response-code']} 200
+
+Run SDNGC Get Request
+ [Documentation] Runs an SDNGC get request
+ [Arguments] ${data_path}
+ ${auth}= Create List ${GLOBAL_SDNGC_USERNAME} ${GLOBAL_SDNGC_PASSWORD}
+ Log Creating session ${SDNGC_REST_ENDPOINT}
+ ${session}= Create Session sdngc ${SDNGC_REST_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 sdngc ${data_path} headers=${headers}
+ Log Received response from sdngc ${resp.text}
+ [Return] ${resp}
+
+Run SDNGC Put Request
+ [Documentation] Runs an SDNGC put request
+ [Arguments] ${data_path} ${data}
+ ${auth}= Create List ${GLOBAL_SDNGC_USERNAME} ${GLOBAL_SDNGC_PASSWORD}
+ Log Creating session ${SDNGC_REST_ENDPOINT}
+ ${session}= Create Session sdngc ${SDNGC_REST_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 sdngc ${data_path} data=${data} headers=${headers}
+ Log Received response from sdngc ${resp.text}
+ [Return] ${resp}
+
+Run SDNGC Post Request
+ [Documentation] Runs an SDNGC post request
+ [Arguments] ${data_path} ${data}
+ ${auth}= Create List ${GLOBAL_SDNGC_USERNAME} ${GLOBAL_SDNGC_PASSWORD}
+ Log Creating session ${SDNGC_REST_ENDPOINT}
+ ${session}= Create Session sdngc ${SDNGC_REST_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 sdngc ${data_path} data=${data} headers=${headers}
+ Log Received response from sdngc ${resp.text}
+ [Return] ${resp}
+
+Run SDNGC Delete Request
+ [Documentation] Runs an SDNGC delete request
+ [Arguments] ${data_path}
+ ${auth}= Create List ${GLOBAL_SDNGC_USERNAME} ${GLOBAL_SDNGC_PASSWORD}
+ Log Creating session ${SDNGC_REST_ENDPOINT}
+ ${session}= Create Session sdngc ${SDNGC_REST_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 sdngc ${data_path} headers=${headers}
+ Log Received response from sdngc ${resp.text}
+ [Return] ${resp}
+
+
+Preload Vnf
+ [Arguments] ${service_type_uuid} ${generic_vnf_name} ${generic_vnf_type} ${vf_module_name} ${vf_modules} ${service} ${uuid}
+ ${base_vf_module_type}= Catenate ''
+ ${closedloop_vf_module}= Create Dictionary
+ ${templates}= Get From Dictionary ${GLOBAL_SERVICE_TEMPLATE_MAPPING} ${service}
+ :for ${vf_module} in @{vf_modules}
+ \ ${vf_module_type}= Get From Dictionary ${vf_module} name
+ \ ${dict} Get From Mapping ${templates} ${vf_module}
+ \ ${filename}= Get From Dictionary ${dict} template
+ \ ${base_vf_module_type}= Set Variable If '${dict['isBase']}' == 'true' ${vf_module_type} ${base_vf_module_type}
+ \ ${closedloop_vf_module}= Set Variable If '${dict['isBase']}' == 'false' ${vf_module} ${closedloop_vf_module}
+ \ ${vf_name}= Update Module Name ${dict} ${vf_module_name}
+ \ Preload Vnf Profile ${vf_module_type}
+ \ Preload One Vnf Topology ${service_type_uuid} ${generic_vnf_name} ${generic_vnf_type} ${vf_name} ${vf_module_type} ${service} ${filename} ${uuid}
+ [Return] ${base_vf_module_type} ${closedloop_vf_module}
+
+
+Update Module Name
+ [Arguments] ${dict} ${vf_module_name}
+ Return From Keyword If 'prefix' not in ${dict} ${vf_module_name}
+ Return From Keyword If '${dict['prefix']}' == '' ${vf_module_name}
+ ${name}= Replace String ${vf_module_name} Vfmodule_ ${dict['prefix']}
+ [Return] ${name}
+
+Get From Mapping
+ [Documentation] Retrieve the appropriate prelad template entry for the passed vf_module
+ [Arguments] ${templates} ${vf_module}
+ ${vf_module_name}= Get From DIctionary ${vf_module} name
+ :for ${template} in @{templates}
+ \ Return From Keyword If '${template['name_pattern']}' in '${vf_module_name}' ${template}
+ [Return] None
+
+
+Preload One Vnf Topology
+ [Arguments] ${service_type_uuid} ${generic_vnf_name} ${generic_vnf_type} ${vf_module_name} ${vf_module_type} ${service} ${filename} ${uuid}
+ Return From Keyword If '${filename}' == ''
+ ${data_template}= OperatingSystem.Get File ${PRELOAD_VNF_TOPOLOGY_OPERATION_BODY}/${filename}
+ ${parameters}= Get Template Parameters ${filename} ${uuid}
+ Set To Dictionary ${parameters} generic_vnf_name=${generic_vnf_name} generic_vnf_type=${generic_vnf_type} service_type=${service_type_uuid} vf_module_name=${vf_module_name} vf_module_type=${vf_module_type} uuid=${uuid}
+ ${data}= Fill JSON Template ${data_template} ${parameters}
+ ${put_resp}= Run SDNGC Post Request ${SDNGC_INDEX_PATH}${PRELOAD_VNF_TOPOLOGY_OPERATION_PATH} ${data}
+ Should Be Equal As Strings ${put_resp.json()['output']['response-code']} 200
+ ${get_resp}= Run SDNGC Get Request ${SDNGC_INDEX_PATH}${PRELOAD_VNF_CONFIG_PATH}/${vf_module_name}/${vf_module_type}
+ Should Be Equal As Strings ${get_resp.status_code} 200
+
+Get Template Parameters
+ [Arguments] ${template} ${uuid}
+ ${rest} ${suite}= Split String From Right ${SUITE NAME} . 1
+ ${uuid}= Catenate ${uuid}
+ ${hostid}= Get Substring ${uuid} -4
+ ${ecompnet}= Evaluate ${GLOBAL_BUILD_NUMBER}%255
+ # Initialize the value map with the properties generated from the Robot VM /opt/config folder
+ ${valuemap}= Copy Dictionary ${GLOBAL_VM_PROPERTIES}
+ # update the value map with unique values.
+ Set To Dictionary ${valuemap} uuid=${uuid} hostid=${hostid} ecompnet=${ecompnet}
+ ${parameters}= Create Dictionary
+ ${defaults}= Get From Dictionary ${GLOBAL_PRELOAD_PARAMETERS} defaults
+ Resolve Values Into Dictionary ${valuemap} ${defaults} ${parameters}
+ ${suite_templates}= Get From Dictionary ${GLOBAL_PRELOAD_PARAMETERS} ${suite}
+ ${template}= Get From Dictionary ${suite_templates} ${template}
+ Resolve Values Into Dictionary ${valuemap} ${template} ${parameters}
+ [Return] ${parameters}
+
+Resolve Values Into Dictionary
+ [Arguments] ${valuemap} ${from} ${to}
+ ${keys}= Get Dictionary Keys ${from}
+ :for ${key} in @{keys}
+ \ ${value}= Get From Dictionary ${from} ${key}
+ \ ${value}= Template String ${value} ${valuemap}
+ \ Set To Dictionary ${to} ${key} ${value}
+
+Preload Vnf Profile
+ [Arguments] ${vnf_name}
+ Login To SDNGC Admin GUI
+ Go To ${SDNGC_ADMIN_VNF_PROFILE_URL}
+ Click Button xpath=//button[@data-target='#add_vnf_profile']
+ Input Text xpath=//input[@id='nf_vnf_type'] ${vnf_name}
+ Input Text xpath=//input[@id='nf_availability_zone_count'] 999
+ Input Text xpath=//input[@id='nf_equipment_role'] robot-ete-test
+ Click Button xpath=//button[contains(.,'Submit')]
+ Page Should Contain VNF Profile
+ Input Text xpath=//div[@id='vnf_profile_filter']//input ${vnf_name}
+ Page Should Contain ${vnf_name}
+
+Delete Vnf Profile
+ [Arguments] ${vnf_name}
+ Login To SDNGC Admin GUI
+ Go To ${SDNGC_ADMIN_VNF_PROFILE_URL}
+ Page Should Contain VNF Profile
+ Input Text xpath=//div[@id='vnf_profile_filter']//input ${vnf_name}
+ Page Should Contain ${vnf_name}
+ Click Button xpath=//button[contains(@onclick, '${vnf_name}')]
+ Page Should Contain Are you sure you want to delete VNF_PROFILE
+ Click Button xpath=//button[contains(text(), 'Yes')]
+ Page Should Not Contain ${vnf_name}
+
+Login To SDNGC Admin GUI
+ [Documentation] Login To SDNGC Admin GUI
+ ## Setup Browser is now being managed by the test case
+ ## Setup Browser
+ Go To ${SDNGC_ADMIN_SIGNUP_URL}
+ Maximize Browser Window
+ Set Selenium Speed ${GLOBAL_SELENIUM_DELAY}
+ Set Browser Implicit Wait ${GLOBAL_SELENIUM_BROWSER_IMPLICIT_WAIT}
+ Log Logging in to ${SDNGC_ADMIN_LOGIN_URL}
+ Handle Proxy Warning
+ Title Should Be AdminPortal
+ ${uuid}= Generate UUID
+ ${shortened_uuid}= Evaluate str("${uuid}")[:12]
+ ${email}= Catenate ${shortened_uuid}@robotete.com
+ Input Text xpath=//input[@id='nf_email'] ${email}
+ Input Password xpath=//input[@id='nf_password'] ${shortened_uuid}
+ Click Button xpath=//button[@type='submit']
+ Wait Until Page Contains User created 20s
+ Go To ${SDNGC_ADMIN_LOGIN_URL}
+ Input Text xpath=//input[@id='email'] ${email}
+ Input Password xpath=//input[@id='password'] ${shortened_uuid}
+ Click Button xpath=//button[@type='submit']
+ Title Should Be SDN-C AdminPortal
+ Log Logged in to ${SDNGC_ADMIN_LOGIN_URL}
diff --git a/kubernetes/config/docker/init/src/config/robot/robot/resources/ssh/files.robot b/kubernetes/config/docker/init/src/config/robot/robot/resources/ssh/files.robot
new file mode 100644
index 0000000000..fcfffbb3b8
--- /dev/null
+++ b/kubernetes/config/docker/init/src/config/robot/robot/resources/ssh/files.robot
@@ -0,0 +1,50 @@
+*** Settings ***
+Documentation Some handy Keywords for accessing log files over SSH. Assumptions are that logs will belong to users other than the currently logged in user and that sudo will be required
+Library OperatingSystem
+Library SSHLibrary
+Library HttpLibrary.HTTP
+Library String
+Library Collections
+
+*** Variables ***
+
+*** Keywords ***
+Open Connection And Log In
+ [Documentation] Open a connection using the passed user and SSH key. Connection alias will be the host name by default.
+ [Arguments] ${HOST} ${user} ${pvt} ${password}= ${alias}=${HOST} ${timeout}=120s
+ Open Connection ${HOST} alias=${alias} timeout=${timeout}
+ Login With Public Key ${user} ${pvt} password=${password} delay=0.5 seconds
+
+Grep Local File
+ [Documentation] Grep the passed file name and return all of the lines that match the passed pattern using the current connection
+ [Arguments] ${pattern} ${fullpath}
+ ${output}= Execute Command grep ${pattern} ${fullpath}
+ [Return] ${output}
+
+ Grep File on Host
+ [Documentation] Grep the passed file name and return all of the lines that match the passed pattern using passed connection alias/host
+ [Arguments] ${host} ${pattern} ${fullpath}
+ Switch Connection ${host}
+ ${output}= Grep Local File ${pattern} ${fullpath}
+ @{lines}= Split To Lines ${output}
+ [Return] @{lines}
+
+Grep File on Hosts
+ [Documentation] Grep the passed file name and return all of the lines that match the passed pattern using passed list of connections
+ [Arguments] ${HOSTS} ${pattern} ${fullpath}
+ &{map}= Create Dictionary
+ :FOR ${HOST} IN @{HOSTS}
+ \ Log ${HOST}
+ \ @{lines}= Grep File on Host ${HOST} ${pattern} ${fullpath}
+ \ &{map}= Create Dictionary ${HOST}=@{lines} &{map}
+ [Return] &{map}
+
+Tail File on Host Until
+ [Documentation] Tail log file into grep which returns file lines containing the grep pattern. Will timeout after timeout= if expected pattern not received.
+ [Arguments] ${host} ${pattern} ${fullpath} ${expected} ${timeout}=60 ${options}=-c -0
+ Switch Connection ${host}
+ ${tailcommand}= Catenate tail ${options} -f ${fullpath} | grep --color=never ${pattern}
+ Write ${tailcommand}
+ ${stdout}= Read Until Regexp ${expected}
+ @{lines}= Split To Lines ${stdout}
+ [Return] @{lines}
diff --git a/kubernetes/config/docker/init/src/config/robot/robot/resources/ssh/processes.robot b/kubernetes/config/docker/init/src/config/robot/robot/resources/ssh/processes.robot
new file mode 100644
index 0000000000..e9f3731866
--- /dev/null
+++ b/kubernetes/config/docker/init/src/config/robot/robot/resources/ssh/processes.robot
@@ -0,0 +1,74 @@
+*** Settings ***
+Documentation Some handy Keywords for accessing log files over SSH. Assumptions are that logs will belong to users other than the currently logged in user and that sudo will be required
+Library OperatingSystem
+Library SSHLibrary 60 seconds
+Library HttpLibrary.HTTP
+Library String
+Library Collections
+
+*** Variables ***
+
+*** Keywords ***
+
+Get Processes
+ [Documentation] Returns all of the processes on the currently connected host
+ ${output}= Execute Command ps -ef
+ ${map}= Create Process Map ${output}
+ [Return] ${map}
+
+Grep Processes
+ [Documentation] Return the list of processes matching the passed regex
+ [Arguments] ${pattern}
+ ${output}= Execute Command ps -ef|grep "${pattern}"|grep -v grep
+ ${map}= Create Process Map ${output}
+ [Return] ${map}
+
+Create Process Map
+ [Documentation] Extract process pids and process names from ps -ef output
+ [Arguments] ${input}
+ @{lines}= Split To Lines ${input}
+ ${map}= Create Dictionary
+ :for ${line} in @{lines}
+ \ @{parts}= Split String ${line} max_split=7
+ \ ${pid}= Catenate ${parts[1]}
+ \ ${name}= Catenate ${parts[7]}
+ \ Set To Dictionary ${map} ${pid}=${name}
+ [Return] ${map}
+
+
+Wait for Process on Host
+ [Documentation] Wait for the passed process name (regular expression) to be running on the passed host
+ [Arguments] ${process_name} ${host} ${timeout}=600s
+ ${map}= Wait Until Keyword Succeeds ${timeout} 10 sec Is Process On Host ${process_name} ${host}
+ [Return] ${map}
+
+
+Pkill Process on Host
+ [Documentation] Kill the named process(es). Process name must match exactly
+ [Arguments] ${process_name} ${host} ${timeout}=600s
+ Switch Connection ${host}
+ ${output}= Execute Command pkill -9 -e -f ${process_name}
+ [Return] ${output}
+
+Is Process on Host
+ [Documentation] Look for the passed process name (regex) to be running on the passed host. Process name can include regex.
+ [Arguments] ${process_name} ${host}
+ Switch Connection ${host}
+ ${pass} ${map}= Run Keyword and Ignore Error Grep Processes ${process_name}
+ @{pids}= Get Dictionary Keys ${map}
+ ${foundpid}= Catenate ""
+ :for ${pid} in @{pids}
+ \ ${process_cmd}= Get From Dictionary ${map} ${pid}
+ \ ${status} ${value}= Run Keyword And Ignore Error Should Match Regexp ${process_cmd} ${process_name}
+ \ Run Keyword If '${status}' == 'PASS' Set Test Variable ${foundpid} ${pid}
+ Should Not Be Equal ${foundpid} ""
+ [Return] ${map}[${foundpid}]
+
+
+Get Process List on Host
+ [Documentation] Gets the list of all processes on the passed host
+ [Arguments] ${host}
+ Switch Connection ${host}
+ ${map}= Get Processes
+ [Return] ${map}
+ \ No newline at end of file
diff --git a/kubernetes/config/docker/init/src/config/robot/robot/resources/stack_validation/darkstat_interface.robot b/kubernetes/config/docker/init/src/config/robot/robot/resources/stack_validation/darkstat_interface.robot
new file mode 100644
index 0000000000..3537408aae
--- /dev/null
+++ b/kubernetes/config/docker/init/src/config/robot/robot/resources/stack_validation/darkstat_interface.robot
@@ -0,0 +1,82 @@
+*** 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 ExtendedSelenium2Library
+Library StringTemplater
+Library UUID
+Library OperatingSystem
+Resource ../global_properties.robot
+Resource ../browser_setup.robot
+
+*** Variables ***
+${SNK_HOSTS_TEMPLATE} http://\${host}:\${port}/hosts/
+${SNK_HOME_TEMPLATE} http://\${host}:\${port}/
+${SNK_PATH}
+${SNK_PORT} 667
+${BYTES_PER_PACKET} 29
+${PACKETS_PER_SECOND_PER_STREAM} 11
+${MONITOR_INTERVAL_IN_SECONDS} 4
+
+*** Keywords ***
+Get Darkstat Bytes In
+ [Documentation] Get bytes received on the passed interface for the given interval
+ [Arguments] ${host} ${interface} ${interval}=${MONITOR_INTERVAL_IN_SECONDS}
+ ${map}= Create Dictionary host=${host} port=${SNK_PORT} path=${SNK_PATH}
+ ${url}= Template String ${SNK_HOSTS_TEMPLATE} ${map}
+ Connect to Darkstat ${host} ${url}
+ Title Should Be Hosts (darkstat3 eth1)
+ ${initial_bytes}= Get Current Bytes In ${interface}
+ Sleep ${interval}
+ Go To ${url}
+ ${new_bytes}= Get Current Bytes In ${interface}
+ ${return_bytes}= Evaluate int(${new_bytes}) - int(${initial_bytes})
+ [Return] ${return_bytes}
+
+Get Darkstat Packets In
+ [Documentation] Get bytes received on the passed interface for the given interval
+ [Arguments] ${host} ${interval}=${MONITOR_INTERVAL_IN_SECONDS}
+ ${map}= Create Dictionary host=${host} port=${SNK_PORT} path=${SNK_PATH}
+ ${url}= Template String ${SNK_HOME_TEMPLATE} ${map}
+ Connect to Darkstat ${host} ${url}
+ Title Should Be Graphs (darkstat3 eth1)
+ ${initial_pkts}= Get Current Packets In
+ Sleep ${interval}
+ Go To ${url}
+ ${new_pkts}= Get Current Packets In
+ ${return_pkts}= Evaluate int(${new_pkts}) - int(${initial_pkts})
+ [Return] ${return_pkts}
+
+
+Connect to Darkstat
+ [Documentation] COnnects to the Darkstat port on passed host
+ [Arguments] ${host} ${url}
+ ## Being managed by the test case
+ ##Setup Browser
+ Go To ${url}
+ Maximize Browser Window
+ Set Selenium Speed ${GLOBAL_SELENIUM_DELAY}
+ Set Browser Implicit Wait ${GLOBAL_SELENIUM_BROWSER_IMPLICIT_WAIT}
+ Log Logging in to ${url}
+ Handle Proxy Warning
+
+
+Get Current Bytes In
+ [Documentation] Retrieves packets input from given host from current Darkstats hosts page
+ [Arguments] ${interface}
+ ${bytes}= Get Text xpath=//tr[td/a[text() = '${interface}']]/td[4]
+ ${bytes}= Evaluate ${bytes.replace(',', '')}
+ [Return] ${bytes}
+
+Get Current Packets In
+ [Documentation] Retrieves packets input from given host from current Darkstats hosts page
+ ${bytes}= Get Text xpath=//span[@id = 'tp']
+ ${bytes}= Evaluate ${bytes.replace(',', '')}
+ [Return] ${bytes}
+
+
+Get Expected Range For Number Of Streams
+ [Documentation] Calculates the expected range of bytes for an interval for the given number of streams
+ [Arguments] ${number_of_streams}
+ ${bytes_per_second}= Evaluate ${BYTES_PER_PACKET}*(${PACKETS_PER_SECOND_PER_STREAM}*${number_of_streams})
+ ${low_bytes}= Evaluate (${MONITOR_INTERVAL_IN_SECONDS}-1)*${bytes_per_second}
+ ${high_bytes}= Evaluate (${MONITOR_INTERVAL_IN_SECONDS}+1)*${bytes_per_second}
+ [Return] ${low_bytes} ${high_bytes} \ No newline at end of file
diff --git a/kubernetes/config/docker/init/src/config/robot/robot/resources/stack_validation/packet_generator_interface.robot b/kubernetes/config/docker/init/src/config/robot/robot/resources/stack_validation/packet_generator_interface.robot
new file mode 100644
index 0000000000..cc9ba04fcc
--- /dev/null
+++ b/kubernetes/config/docker/init/src/config/robot/robot/resources/stack_validation/packet_generator_interface.robot
@@ -0,0 +1,98 @@
+*** 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 StringTemplater
+Library UUID
+Library OperatingSystem
+Resource ../global_properties.robot
+Resource ../json_templater.robot
+
+*** Variables ***
+${PGN_URL_TEMPLATE} http://\${host}:\${port}
+${PGN_PATH} /restconf/config/sample-plugin:sample-plugin
+${PGN_ENABLE_STREAM_TEMPLATE} robot/assets/templates/vfw_pg_stream_enable.template
+${PGN_ENABLE_STREAMS_TEMPLATE} robot/assets/templates/vfw_pg_streams_enable.template
+
+*** Keywords ***
+Connect To Packet Generator
+ [Documentation] Enables packet generator for the passed stream on the passed host
+ [Arguments] ${host} ${alias}=pgn
+ ${map}= Create Dictionary host=${host} port=${GLOBAL_PACKET_GENERATOR_PORT} path=${PGN_PATH}
+ ${url}= Template String ${PGN_URL_TEMPLATE} ${map}
+ ${auth}= Create List ${GLOBAL_PACKET_GENERATOR_USERNAME} ${GLOBAL_PACKET_GENERATOR_PASSWORD}
+ ${session}= Create Session ${alias} ${url} auth=${auth}
+ [Return] ${session}
+
+Enable Stream
+ [Documentation] Enable a single stream on the passed packet generator host IP
+ [Arguments] ${host} ${stream}=udp1 ${alias}=pgn
+ Connect To Packet Generator ${host} alias=${alias}
+ ${headers}= Create Headers
+ ${data_path}= Catenate ${PGN_PATH}/pg-streams
+ ${map}= Create Dictionary stream=${stream}
+ ${streams}= Fill JSON Template File ${PGN_ENABLE_STREAM_TEMPLATE} ${map}
+ ${streams}= evaluate json.dumps(${streams}) json
+ ${map}= Create Dictionary pgstreams=${streams}
+ ${data}= Fill JSON Template File ${PGN_ENABLE_STREAMS_TEMPLATE} ${map}
+ ${resp}= Put Request ${alias} ${data_path} data=${data} headers=${headers}
+ Should Be Equal As Strings ${resp.status_code} 200
+ [Return] ${resp}
+
+Enable Streams
+ [Documentation] Enable <stream_count> number of streams on the passed packet generator host IP
+ [Arguments] ${host} ${stream_count}=5 ${alias}=pgn ${prefix}=fw_udp
+ Connect To Packet Generator ${host} alias=${alias}
+ ${headers}= Create Headers
+ ${data_path}= Catenate ${PGN_PATH}/pg-streams
+ ${streams}= Set Variable
+ ${comma}= Set Variable
+ ${stream_count}= Evaluate ${stream_count}+1
+ :for ${i} in Range 1 ${stream_count}
+ \ ${name}= Catenate ${prefix}${i}
+ \ ${map}= Create Dictionary stream=${name}
+ \ ${one}= Fill JSON Template File ${PGN_ENABLE_STREAM_TEMPLATE} ${map}
+ \ ${one}= evaluate json.dumps(${one}) json
+ \ ${streams}= Set Variable ${streams}${comma}${one}
+ \ ${comma}= Set Variable ,
+ ${map}= Create Dictionary pgstreams=${streams}
+ ${data}= Fill JSON Template File ${PGN_ENABLE_STREAMS_TEMPLATE} ${map}
+ ${resp}= Put Request ${alias} ${data_path} data=${data} headers=${headers}
+ Should Be Equal As Strings ${resp.status_code} 200
+ [Return] ${resp}
+
+Disable All Streams
+ [Documentation] Disable all streams on the passed packet generator host IP
+ [Arguments] ${host} ${stream}=udp1 ${alias}=pgn
+ Connect To Packet Generator ${host} alias=${alias}
+ ${headers}= Create Headers
+ ${data_path}= Catenate ${PGN_PATH}/pg-streams
+ ${data}= Catenate {"pg-streams":{"pg-stream": []}}
+ ${resp}= Put Request ${alias} ${data_path} data=${data} headers=${headers}
+ Should Be Equal As Strings ${resp.status_code} 200
+ [Return] ${resp}
+
+ Disable Stream
+ [Documentation] Disables packet generator for the passed stream
+ [Arguments] ${host} ${stream}=udp1 ${alias}=pgn
+ ${session}= Connect To Packet Generator ${host} alias=${alias}
+ ${headers}= Create Headers
+ ${data_path}= Catenate ${PGN_PATH}/pg-streams/pg-stream/${stream}
+ ${resp}= Delete Request ${alias} ${data_path} headers=${headers}
+ Should Be Equal As Strings ${resp.status_code} 200
+ [Return] ${resp}
+
+Get List Of Enabled Streams
+ [Documentation] Get a list of streams on the passed packet generator host IP
+ [Arguments] ${host} ${alias}=pgn
+ ${session}= Connect To Packet Generator ${host} alias=${alias}
+ ${headers}= Create Headers
+ ${data_path}= Catenate /
+ ${resp}= Get Request ${alias} ${PGN_PATH} headers=${headers}
+ Should Be Equal As Strings ${resp.status_code} 200
+ [Return] ${resp.json()}
+
+
+Create Headers
+ ${uuid}= Generate UUID
+ ${headers}= Create Dictionary Accept=application/json Content-Type=application/json X-TransactionId=${GLOBAL_APPLICATION_ID}-${uuid} X-FromAppId=${GLOBAL_APPLICATION_ID}
+ [Return] ${headers} \ No newline at end of file
diff --git a/kubernetes/config/docker/init/src/config/robot/robot/resources/stack_validation/policy_check_vfw.robot b/kubernetes/config/docker/init/src/config/robot/robot/resources/stack_validation/policy_check_vfw.robot
new file mode 100644
index 0000000000..22340729c7
--- /dev/null
+++ b/kubernetes/config/docker/init/src/config/robot/robot/resources/stack_validation/policy_check_vfw.robot
@@ -0,0 +1,96 @@
+*** Settings ***
+Documentation Testing openstack.
+Library OperatingSystem
+Library Process
+Library SSHLibrary
+Library RequestsLibrary
+Library JSONUtils
+Library OpenstackLibrary
+Library HEATUtils
+Library Collections
+LIbrary String
+Resource ../../resources/openstack/keystone_interface.robot
+Resource ../../resources/openstack/nova_interface.robot
+Resource ../../resources/openstack/heat_interface.robot
+Resource ../../resources/ssh/files.robot
+Resource ../../resources/ssh/processes.robot
+Resource packet_generator_interface.robot
+Resource darkstat_interface.robot
+Resource validate_common.robot
+Resource ../../resources/test_templates/vnf_orchestration_test_template.robot
+
+
+*** Variables ***
+
+*** Keywords ***
+Policy Check Firewall Stack
+ [Documentation] Executes the vFW policy closed loop test.
+ [Arguments] ${stack_name} ${policy_rate}
+ Run Openstack Auth Request auth
+ ${stack_info}= Wait for Stack to Be Deployed auth ${stack_name}
+ ${stack_id}= Get From Dictionary ${stack_info} id
+ ${server_list}= Get Openstack Servers auth
+ Log ${server_list}
+ ${vpg_unprotected_ip}= Get From Dictionary ${stack_info} vpg_private_ip_0
+ ${vsn_protected_ip}= Get From Dictionary ${stack_info} vsn_private_ip_0
+ ${vpg_public_ip}= Get Server Ip ${server_list} ${stack_info} vpg_name_0 network_name=public
+ ${vsn_public_ip}= Get Server Ip ${server_list} ${stack_info} vsn_name_0 network_name=public
+ ${upper_bound}= Evaluate ${policy_rate}*2
+ Wait Until Keyword Succeeds 300s 1s Run VFW Policy Check ${vpg_public_ip} ${policy_rate} ${upper_bound} 1
+
+Run VFW Policy Check
+ [Documentation] Push traffic above upper bound, wait for policy to fix it, push traffic to lower bound, wait for policy to fix it,
+ [Arguments] ${vpg_public_ip} ${policy_rate} ${upper_bound} ${lower_bound}
+ # Force traffic above threshold
+ Check For Policy Enforcement ${vpg_public_ip} ${policy_rate} ${upper_bound}
+ # Force traffic below threshold
+ Check For Policy Enforcement ${vpg_public_ip} ${policy_rate} ${lower_bound}
+
+
+Check For Policy Enforcement
+ [Documentation] Push traffic above upper bound, wait for policy to fix it, push traffic to lower bound, wait for policy to fix it,
+ [Arguments] ${vpg_public_ip} ${policy_rate} ${forced_rate}
+ Enable Streams ${vpg_public_ip} ${forced_rate}
+ Wait Until Keyword Succeeds 20s 5s Test For Expected Rate ${vpg_public_ip} ${forced_rate}
+ Wait Until Keyword Succeeds 280s 5s Test For Expected Rate ${vpg_public_ip} ${policy_rate}
+
+Test For Expected Rate
+ [Documentation] Ge the number of pg-streams from the PGN, and test to see if it is what we expect.
+ [Arguments] ${vpg_public_ip} ${number_of_streams}
+ ${list}= Get List Of Enabled Streams ${vpg_public_ip}
+ ${list}= Evaluate ${list['sample-plugin']}['pg-streams']['pg-stream']
+ Length Should Be ${list} ${number_of_streams}
+
+
+
+Policy Check vLB Stack
+ [Documentation] Executes the vLB policy closed loop test
+ [Arguments] ${stack_name} ${policy_rate}
+ Run Openstack Auth Request auth
+ ${stack_info}= Wait for Stack to Be Deployed auth ${stack_name}
+ ${stack_id}= Get From Dictionary ${stack_info} id
+ ${server_list}= Get Openstack Servers auth
+ ${vlb_public_ip}= Get Server Ip ${server_list} ${stack_info} vlb_name_0 network_name=public
+ ${upper_bound}= Evaluate ${policy_rate}*2
+ Start DNS Traffic ${vlb_public_ip} ${upper_bound}
+
+ # Now wiat for the dnsscaling stack to be deployed
+ ${prefix}= Get DNSScaling Prefix
+ ${dnsscaling}= Replace String Using Regexp ${stack_name} ^Vfmodule_ ${prefix}
+ ${dnsscaling_info}= Wait for Stack to Be Deployed auth ${dnsscaling}
+ VLB Closed Loop Hack Update ${dnsscaling}
+ # TO DO: Log into vLB and cehck that traffic is flowing to the new DNS
+ [Return] ${dnsscaling}
+
+Get DNSScaling Prefix
+ ${mapping}= Get From Dictionary ${GLOBAL_SERVICE_TEMPLATE_MAPPING} vLB
+ :for ${dict} in @{mapping}
+ \ Return From Keyword If '${dict['isBase']}' == 'false' ${dict['prefix']}
+ [Return] None
+
+
+Start DNS Traffic
+ [Documentation] Run nslookups at rate per second. Run for 10 minutes or until it is called by the terminate process
+ [Arguments] ${vlb_public_ip} ${rate}
+ ${pid}= Start Process ./dnstraffic.sh ${vlb_public_ip} ${rate} ${GLOBAL_DNS_TRAFFIC_DURATION}
+ [Return] ${pid} \ No newline at end of file
diff --git a/kubernetes/config/docker/init/src/config/robot/robot/resources/stack_validation/validate_common.robot b/kubernetes/config/docker/init/src/config/robot/robot/resources/stack_validation/validate_common.robot
new file mode 100644
index 0000000000..24f9fe3310
--- /dev/null
+++ b/kubernetes/config/docker/init/src/config/robot/robot/resources/stack_validation/validate_common.robot
@@ -0,0 +1,47 @@
+*** Settings ***
+Documentation Testing openstack.
+Library OperatingSystem
+Library SSHLibrary
+Library RequestsLibrary
+Library JSONUtils
+Library OpenstackLibrary
+Library HEATUtils
+Library Collections
+Resource ../../resources/openstack/keystone_interface.robot
+Resource ../../resources/openstack/nova_interface.robot
+Resource ../../resources/openstack/heat_interface.robot
+Resource ../../resources/ssh/files.robot
+Resource ../../resources/ssh/processes.robot
+Resource packet_generator_interface.robot
+
+
+*** Variables ***
+
+*** Keywords ***
+Wait For Server
+ [Documentation] Attempts to login to the passed server info and verify (??). Uses server info to get public ip and locate corresponding provate key file
+ [Arguments] ${server_ip} ${timeout}=300s
+ ${file}= Catenate ${GLOBAL_VM_PRIVATE_KEY}
+ Wait Until Keyword Succeeds ${timeout} 5 sec Open Connection And Log In ${server_ip} root ${file}
+ ${lines}= Grep Local File "Accepted publickey" /var/log/auth.log
+ Log ${lines}
+ Should Not Be Empty ${lines}
+
+Get Server Ip
+ [Arguments] ${server_list} ${stack_info} ${key_name} ${network_name}=public
+ ${server_name}= Get From Dictionary ${stack_info} ${key_name}
+ ${server}= Get From Dictionary ${server_list} ${server_name}
+ Log Entering Get Openstack Server Ip
+ ${ip}= Get Openstack Server Ip ${server} network_name=${network_name}
+ Log Returned Get Openstack Server Ip
+ [Return] ${ip}
+
+Find And Reboot The Server
+ [Documentation] Code to reboot the server by teh heat server name parameter value
+ [Arguments] ${stack_info} ${server_list} ${server_name_parameter}
+ ${server_name}= Get From Dictionary ${stack_info} ${server_name_parameter}
+ ${vfw_server}= Get From Dictionary ${server_list} ${server_name}
+ ${vfw_server_id}= Get From Dictionary ${vfw_server} id
+ Reboot Server auth ${vfw_server_id}
+
+
diff --git a/kubernetes/config/docker/init/src/config/robot/robot/resources/stack_validation/validate_dns_scaling.robot b/kubernetes/config/docker/init/src/config/robot/robot/resources/stack_validation/validate_dns_scaling.robot
new file mode 100644
index 0000000000..b455659146
--- /dev/null
+++ b/kubernetes/config/docker/init/src/config/robot/robot/resources/stack_validation/validate_dns_scaling.robot
@@ -0,0 +1,41 @@
+*** Settings ***
+Documentation Testing openstack.
+Library OperatingSystem
+Library SSHLibrary
+Library RequestsLibrary
+Library JSONUtils
+Library OpenstackLibrary
+Library HEATUtils
+Library Collections
+Resource ../../resources/openstack/keystone_interface.robot
+Resource ../../resources/openstack/nova_interface.robot
+Resource ../../resources/openstack/heat_interface.robot
+Resource ../../resources/ssh/files.robot
+Resource ../../resources/ssh/processes.robot
+Resource packet_generator_interface.robot
+Resource validate_common.robot
+
+
+*** Variables ***
+
+*** Keywords ***
+Validate Dns Scaling Stack
+ [Documentation] Wait for the DNS scaling stack to be instantiated
+ [Arguments] ${STACK_NAME}
+ Run Openstack Auth Request auth
+ ${stack_info}= Wait for Stack to Be Deployed auth ${STACK_NAME}
+ ${stack_id}= Get From Dictionary ${stack_info} id
+ ${server_list}= Get Openstack Servers auth
+ Log ${server_list}
+ ${vdns_public_ip}= Get Server Ip ${server_list} ${stack_info} vdns_name_0 network_name=public
+ Wait For Server ${vdns_public_ip}
+ Log Accessed all servers
+ #Wait for vDNS ${vdns_public_ip}
+ Log All server processes up
+
+Wait For vDNS
+ [Documentation] Wait for the DNSServer to be running on the scaling DNS.
+ ... Disabled. Potential for robot to hang due to network reconfigurations at startup.
+ [Arguments] ${ip}
+ Wait for Process on Host java DNSServer ${ip}
+
diff --git a/kubernetes/config/docker/init/src/config/robot/robot/resources/stack_validation/validate_vfw.robot b/kubernetes/config/docker/init/src/config/robot/robot/resources/stack_validation/validate_vfw.robot
new file mode 100644
index 0000000000..b0d591fbe7
--- /dev/null
+++ b/kubernetes/config/docker/init/src/config/robot/robot/resources/stack_validation/validate_vfw.robot
@@ -0,0 +1,77 @@
+*** Settings ***
+Documentation Testing openstack.
+Library OperatingSystem
+Library SSHLibrary
+Library RequestsLibrary
+Library JSONUtils
+Library OpenstackLibrary
+Library HEATUtils
+Library Collections
+Resource ../../resources/openstack/keystone_interface.robot
+Resource ../../resources/openstack/nova_interface.robot
+Resource ../../resources/openstack/heat_interface.robot
+Resource ../../resources/ssh/files.robot
+Resource ../../resources/ssh/processes.robot
+Resource ../appc_interface.robot
+Resource packet_generator_interface.robot
+Resource validate_common.robot
+
+
+*** Variables ***
+
+*** Keywords ***
+Validate Firewall Stack
+ [Documentation] Identifies and validates the firewall servers in the VFW Stack
+ [Arguments] ${STACK_NAME}
+ Run Openstack Auth Request auth
+ ${stack_info}= Wait for Stack to Be Deployed auth ${STACK_NAME}
+ ${stack_id}= Get From Dictionary ${stack_info} id
+ ${server_list}= Get Openstack Servers auth
+
+ ${vpg_unprotected_ip}= Get From Dictionary ${stack_info} vpg_private_ip_0
+ ${vsn_protected_ip}= Get From Dictionary ${stack_info} vsn_private_ip_0
+ ${vpg_name_0}= Get From Dictionary ${stack_info} vpg_name_0
+ ${vfw_public_ip}= Get Server Ip ${server_list} ${stack_info} vfw_name_0 network_name=public
+ ${vpg_public_ip}= Get Server Ip ${server_list} ${stack_info} vpg_name_0 network_name=public
+ ${vsn_public_ip}= Get Server Ip ${server_list} ${stack_info} vsn_name_0 network_name=public
+
+ Wait For Server ${vfw_public_ip}
+ Wait For Server ${vpg_public_ip}
+ Wait For Server ${vsn_public_ip}
+ Log Accessed all servers
+ Wait For Firewall ${vfw_public_ip}
+ Wait For Packet Generator ${vpg_public_ip}
+ Wait For Packet Sink ${vsn_public_ip}
+ Log All server processes up
+ ${vpg_oam_ip}= Get From Dictionary ${stack_info} vpg_private_ip_1
+ ${appc}= Create Mount Point In APPC ${vpg_name_0} ${vpg_oam_ip}
+ Wait For Packets ${vpg_public_ip} ${vpg_unprotected_ip} ${vsn_protected_ip} ${vsn_public_ip}
+
+Wait For Packets
+ [Documentation] Final vfw validation that packets are flowing from the pgn VM to the snk VM
+ [Arguments] ${vpg_public_ip} ${vpg_unprotected_ip} ${vsn_protected_ip} ${vsn_public_ip}
+ ${resp}= Enable Stream ${vpg_public_ip}
+ Should Be Equal As Strings ${resp.status_code} 200
+ ${syslog_message}= Catenate UDP: short packet: From ${vpg_unprotected_ip}:.* to ${vsn_protected_ip}:.*
+ Tail File on Host Until ${vsn_public_ip} UDP: /var/log/syslog ${syslog_message} timeout=120s
+ Disable All Streams ${vpg_public_ip}
+
+
+Wait For Firewall
+ [Documentation] Wait for the defined firewall processes to come up
+ [Arguments] ${ip}
+ Wait for Process on Host ./vpp_measurement_reporter ${ip}
+ Wait for Process on Host vpp -c /etc/vpp/startup.conf ${ip}
+
+Wait For Packet Generator
+ [Documentation] Wait for the defined packet generator processes to come up
+ [Arguments] ${ip}
+ Wait for Process on Host vpp -c /etc/vpp/startup.conf ${ip}
+ Wait Until Keyword Succeeds 180s 5s Tail File on Host Until ${ip} Honeycomb /var/log/honeycomb/honeycomb.log - Honeycomb initialized options=-c +0 timeout=120s
+ Run Keyword And Ignore Error Wait for Process on Host run_traffic_fw_demo.sh ${ip} timeout=60s
+ Pkill Process On Host "/bin/bash ./run_traffic_fw_demo.sh" ${ip}
+
+Wait For Packet Sink
+ [Documentation] Wait for the defined packet sink processes to come up
+ [Arguments] ${ip}
+ Log noting to check on ${ip}
diff --git a/kubernetes/config/docker/init/src/config/robot/robot/resources/stack_validation/validate_vlb.robot b/kubernetes/config/docker/init/src/config/robot/robot/resources/stack_validation/validate_vlb.robot
new file mode 100644
index 0000000000..bab15648f0
--- /dev/null
+++ b/kubernetes/config/docker/init/src/config/robot/robot/resources/stack_validation/validate_vlb.robot
@@ -0,0 +1,40 @@
+*** Settings ***
+Documentation Testing openstack.
+Library String
+Library DNSUtils
+Library Collections
+Library SSHLibrary
+Resource validate_common.robot
+
+
+*** Variables ***
+
+*** Keywords ***
+Validate vLB Stack
+ [Documentation] Identifies the LB and DNS servers in the vLB stack
+ [Arguments] ${stack_name}
+ Run Openstack Auth Request auth
+ ${stack_info}= Wait for Stack to Be Deployed auth ${stack_name}
+ ${stack_id}= Get From Dictionary ${stack_info} id
+ ${server_list}= Get Openstack Servers auth
+ Log Returned from Get Openstack Servers
+ ${vlb_public_ip}= Get Server Ip ${server_list} ${stack_info} vlb_name_0 network_name=public
+ Log Waiting for ${vlb_public_ip} to reconfigure
+ Sleep 180s
+ # Server validations diabled due to issues with load balancer network reconfiguration
+ # at startup hanging the robot scripts
+ Wait For vLB ${vlb_public_ip}
+ Log All server processes up
+
+Wait For vLB
+ [Documentation] Wait for the VLB to be functioning as a DNS
+ [Arguments] ${ip}
+ Wait Until Keyword Succeeds 300s 10s DNSTest ${ip}
+ Log Succeeded
+
+DNSTest
+ [Documentation] Wait for the defined VLoadBalancer to process nslookup
+ [Arguments] ${ip}
+ Log Looking up ${ip}
+ #${returned_ip}= Dns Request host1.dnsdemo.openecomp.org ${ip}
+ #Should Contain '${returned_ip}' .
diff --git a/kubernetes/config/docker/init/src/config/robot/robot/resources/stack_validation/validate_vvg.robot b/kubernetes/config/docker/init/src/config/robot/robot/resources/stack_validation/validate_vvg.robot
new file mode 100644
index 0000000000..05b1e8a53d
--- /dev/null
+++ b/kubernetes/config/docker/init/src/config/robot/robot/resources/stack_validation/validate_vvg.robot
@@ -0,0 +1,16 @@
+*** Settings ***
+Documentation Testing openstack.
+Library String
+Library DNSUtils
+Library Collections
+Resource validate_common.robot
+
+
+*** Variables ***
+
+*** Keywords ***
+Validate vVG Stack
+ [Documentation] Validation of vVG stack (TBD)
+ [Arguments] ${stack_name}
+ Log All server processes up
+
diff --git a/kubernetes/config/docker/init/src/config/robot/robot/resources/test_templates/closedloop_test_template.robot b/kubernetes/config/docker/init/src/config/robot/robot/resources/test_templates/closedloop_test_template.robot
new file mode 100644
index 0000000000..e5a5ca92f6
--- /dev/null
+++ b/kubernetes/config/docker/init/src/config/robot/robot/resources/test_templates/closedloop_test_template.robot
@@ -0,0 +1,202 @@
+*** Settings ***
+Documentation Policy Closed Loop Test cases
+
+Resource ../policy_interface.robot
+Resource ../stack_validation/policy_check_vfw.robot
+Resource vnf_orchestration_test_template.robot
+Library String
+Library HttpLibrary.HTTP
+LIbrary Process
+
+*** Variables ***
+${RESOURCE_PATH_CREATE} /PyPDPServer/createPolicy
+${RESOURCE_PATH_CREATE_PUSH} /PyPDPServer/pushPolicy
+${RESOURCE_PATH_CREATE_DELETE} /PyPDPServer/deletePolicy
+${RESOURCE_PATH_GET_CONFIG} /PyPDPServer/getConfig
+${CREATE_CONFIG_TEMPLATE} robot/assets/templates/policy/closedloop_configpolicy.template
+${CREATE_OPS_TEMPLATE} robot/assets/templates/policy/closedloop_opspolicy.template
+${PUSH_POLICY_TEMPLATE} robot/assets/templates/policy/closedloop_pushpolicy.template
+${DEL_POLICY_TEMPLATE} robot/assets/templates/policy/closedloop_deletepolicy.template
+${GECONFIG_VFW_TEMPLATE} robot/assets/templates/policy/closedloop_getconfigpolicy.template
+
+# 'Normal' number of pg streams that will be set when policy is triggered
+${VFWPOLICYRATE} 5
+
+# Max nslookup requests per second before triggering event.
+${VLBPOLICYRATE} 20
+
+${CONFIG_POLICY_NAME} vFirewall
+${CONFIG_POLICY_TYPE} Unknown
+${OPS_POLICY_NAME}
+${OPS_POLICY_TYPE} BRMS_PARAM
+
+# VFW low threshold
+${Expected_Severity_1} MAJOR
+${Expected_Threshold_1} 300
+${Expected_Direction_1} LESS_OR_EQUAL
+
+# VFW high threshold
+${Expected_Severity_2} CRITICAL
+${Expected_Threshold_2} 700
+${Expected_Direction_2} GREATER_OR_EQUAL
+
+# VDNS High threshold
+${Expected_Severity_3} MAJOR
+${Expected_Threshold_3} 200
+${Expected_Direction_3} GREATER_OR_EQUAL
+
+#********** Test Case Variables ************
+${DNSSCALINGSTACK}
+
+*** Keywords ***
+VFW Policy
+ Log Suite name ${SUITE NAME} ${TEST NAME} ${PREV TEST NAME}
+ Initialize VFW Policy
+ ${stackname}= Orchestrate VNF vFW closedloop
+ Policy Check Firewall Stack ${stackname} ${VFWPOLICYRATE}
+
+
+VDNS Policy
+ Initialize VDNS Policy
+ ${stackname}= Orchestrate VNF vDNS closedloop
+ ${dnsscaling}= Policy Check vLB Stack ${stackname} ${VLBPOLICYRATE}
+ Set Test Variable ${DNSSCALINGSTACK} ${dnsscaling}
+
+Initialize VFW Policy
+# Create Config Policy
+# Push Config Policy ${CONFIG_POLICY_NAME} ${CONFIG_POLICY_TYPE}
+# Create Ops Policy
+# Push Ops Policy ${OPS_POLICY_NAME} ${OPS_POLICY_TYPE}
+ Get Configs VFW Policy
+
+Initialize VDNS Policy
+ Get Configs VDNS Policy
+
+Get Configs VFW Policy
+ [Documentation] Get Config Policy for VFW
+ ${getconfigpolicy}= Catenate .*${CONFIG_POLICY_NAME}*
+ ${configpolicy_name}= Create Dictionary config_policy_name=${getconfigpolicy}
+ ${output} = Fill JSON Template File ${GECONFIG_VFW_TEMPLATE} ${configpolicy_name}
+ ${get_resp} = Run Policy Get Configs Request ${RESOURCE_PATH_GET_CONFIG} ${output}
+ Should Be Equal As Strings ${get_resp.status_code} 200
+
+ ${json}= Parse Json ${get_resp.content}
+ ${config}= Parse Json ${json[0]["config"]}
+
+ # Extract object1 from Array
+ ${severity}= Get Variable Value ${config["content"]["thresholds"][0]["severity"]}
+ Should Be Equal ${severity} ${Expected_Severity_1}
+ ${Thresold_Value}= Get Variable Value ${config["content"]["thresholds"][0]["thresholdValue"]}
+ Should Be Equal ${Thresold_Value} ${Expected_Threshold_1}
+ ${direction}= Get Variable Value ${config["content"]["thresholds"][0]["direction"]}
+ Should Be Equal ${direction} ${Expected_Direction_1}
+
+ # Extract object2 from Array
+ ${severity_1}= Get Variable Value ${config["content"]["thresholds"][1]["severity"]}
+ Should Be Equal ${severity_1} ${Expected_Severity_2}
+ ${Thresold_Value_1}= Get Variable Value ${config["content"]["thresholds"][1]["thresholdValue"]}
+ Should Be Equal ${Thresold_Value_1} ${Expected_Threshold_2}
+ ${direction_1}= Get Variable Value ${config["content"]["thresholds"][1]["direction"]}
+ Should Be Equal ${direction_1} ${Expected_Direction_2}
+
+Get Configs VDNS Policy
+ [Documentation] Get Config Policy for VDNS
+ ${getconfigpolicy}= Catenate .*vLoadBalancer*
+ ${configpolicy_name}= Create Dictionary config_policy_name=${getconfigpolicy}
+ ${output} = Fill JSON Template File ${GECONFIG_VFW_TEMPLATE} ${configpolicy_name}
+ ${get_resp} = Run Policy Get Configs Request ${RESOURCE_PATH_GET_CONFIG} ${output}
+ Should Be Equal As Strings ${get_resp.status_code} 200
+ ${json}= Parse Json ${get_resp.content}
+ ${config}= Parse Json ${json[0]["config"]}
+
+ # Extract object1 from Array
+ ${severity}= Get Variable Value ${config["content"]["thresholds"][0]["severity"]}
+ Should Be Equal ${severity} ${Expected_Severity_3}
+ ${Thresold_Value}= Get Variable Value ${config["content"]["thresholds"][0]["thresholdValue"]}
+ Should Be Equal ${Thresold_Value} ${Expected_Threshold_3}
+ ${direction}= Get Variable Value ${config["content"]["thresholds"][0]["direction"]}
+ Should Be Equal ${direction} ${Expected_Direction_3}
+
+Teardown Closed Loop
+ [Documentation] Tear down a closed loop test case
+ Terminate All Processes
+ Teardown VNF
+ Log Teardown complete
+
+Create Config Policy
+ [Documentation] Create Config Policy
+ ${randompolicyname} = Create Policy Name
+ ${policyname1}= Catenate com.${randompolicyname}
+ ${CONFIG_POLICY_NAME}= Set Test Variable ${policyname1}
+ ${configpolicy}= Create Dictionary policy_name=${CONFIG_POLICY_NAME}
+ ${output} = Fill JSON Template File ${CREATE_CONFIG_TEMPLATE} ${configpolicy}
+ ${put_resp} = Run Policy Put Request ${RESOURCE_PATH_CREATE} ${output}
+ Should Be Equal As Strings ${put_resp.status_code} 200
+
+ Create Policy Name
+ [Documentation] Generate Policy Name
+ [Arguments] ${prefix}=ETE_
+ ${random}= Generate Random String 15 [LOWER][NUMBERS]
+ ${policyname}= Catenate ${prefix}${random}
+ [Return] ${policyname}
+
+Create Ops Policy
+ [Documentation] Create Opertional Policy
+ ${randompolicyname} = Create Policy Name
+ ${policyname1}= Catenate com.${randompolicyname}
+ ${OPS_POLICY_NAME}= Set Test Variable ${policyname1}
+ ${dict}= Create Dictionary policy_name=${OPS_POLICY_NAME}
+ #${NEWPOLICY1}= Create Dictionary policy_name=com.${OPS_POLICY_NAME}
+ ${output} = Fill JSON Template File ${CREATE_OPS_TEMPLATE} ${dict}
+ ${put_resp} = Run Policy Put Request ${RESOURCE_PATH_CREATE} ${output}
+ Log ${put_resp}
+ Should Be Equal As Strings ${put_resp.status_code} 200
+
+Push Ops Policy
+ [Documentation] Push Ops Policy
+ [Arguments] ${policyname} ${policytype}
+ ${dict}= Create Dictionary policy_name=${policyname} policy_type=${policytype}
+ ${output} = Fill JSON Template ${PUSH_POLICY_TEMPLATE} ${dict}
+ ${put_resp} = Run Policy Put Request ${RESOURCE_PATH_CREATE_PUSH} ${output}
+ Should Be Equal As Strings ${put_resp.status_code} 200
+
+Push Config Policy
+ [Documentation] Push Config Policy
+ [Arguments] ${policyname} ${policytype}
+ ${dict}= Create Dictionary policy_name=${policyname} policy_type=${policytype}
+ ${output} = Fill JSON Template ${PUSH_POLICY_TEMPLATE} ${dict}
+ ${put_resp} = Run Policy Put Request ${RESOURCE_PATH_CREATE_PUSH} ${output}
+ Should Be Equal As Strings ${put_resp.status_code} 200
+
+
+Delete Config Policy
+ [Documentation] Delete Config Policy
+ [Arguments] ${policy_name}
+ ${policyname3}= Catenate com.Config_BRMS_Param_${policyname}.1.xml
+ ${dict}= Create Dictionary policy_name=${policyname3}
+ ${output} = Fill JSON Template ${DEL_POLICY_TEMPLATE} ${dict}
+ ${put_resp} = Run Policy Delete Request ${RESOURCE_PATH_CREATE_DELETE} ${output}
+ Should Be Equal As Strings ${put_resp.status_code} 200
+
+Delete Ops Policy
+ [Documentation] Delete Ops Policy
+ [Arguments] ${policy_name}
+ ${policyname3}= Catenate com.Config_MS_com.vFirewall.1.xml
+ ${dict}= Create Dictionary policy_name=${policyname3}
+ ${output} = Fill JSON Template ${DEL_POLICY_TEMPLATE} ${dict}
+ ${put_resp} = Run Policy Delete Request ${RESOURCE_PATH_CREATE_DELETE} ${output}
+ Should Be Equal As Strings ${put_resp.status_code} 200
+
+Orchestrate VNF vFW closedloop
+ [Documentation] VNF Orchestration for vFW
+ Log VNF Orchestration flow TEST NAME=${TEST NAME}
+ Setup Orchestrate VNF ${GLOBAL_AAI_CLOUD_OWNER} SharedNode OwnerType v1 CloudZone
+ ${stack_name} ${service}= Orchestrate VNF ETE_CLP vFW vFW ${TENANT_NAME}
+ [Return] ${stack_name}
+
+ Orchestrate VNF vDNS closedloop
+ [Documentation] VNF Orchestration for vLB
+ Log VNF Orchestration flow TEST NAME=${TEST NAME}
+ Setup Orchestrate VNF ${GLOBAL_AAI_CLOUD_OWNER} SharedNode OwnerType v1 CloudZone
+ ${stack_name} ${service}= Orchestrate VNF ETE_CLP vLB vLB ${TENANT_NAME}
+ [Return] ${stack_name}
diff --git a/kubernetes/config/docker/init/src/config/robot/robot/resources/test_templates/model_test_template.robot b/kubernetes/config/docker/init/src/config/robot/robot/resources/test_templates/model_test_template.robot
new file mode 100644
index 0000000000..add942db76
--- /dev/null
+++ b/kubernetes/config/docker/init/src/config/robot/robot/resources/test_templates/model_test_template.robot
@@ -0,0 +1,57 @@
+*** Settings ***
+Documentation The main interface for interacting with ASDC. It handles low level stuff like managing the http request library and DCAE required fields
+Library OperatingSystem
+Library ArchiveLibrary
+Library Collections
+Resource ../asdc_interface.robot
+
+Variables ../../assets/service_mappings.py
+
+*** Variables ***
+${ASDC_BASE_PATH} /sdc1
+${ASDC_DESIGNER_PATH} /proxy-designer1#/dashboard
+${ASDC_ASSETS_DIRECTORY} robot/assets/asdc
+${VFW_DIRECTORY} base_vfw
+${VLB_DIRECTORY} base_vlb
+${VVG_DIRECTORY} base_vvg
+${SCALING_DIRECTORY} dns_scaling
+${ASDC_ZIP_DIRECTORY} ${ASDC_ASSETS_DIRECTORY}/temp
+
+#***************** Test Case Variables *********************
+${CATALOG_RESOURCE_IDS}
+${CATALOG_SERVICE_ID}
+
+*** Keywords ***
+
+Model Distribution For Directory
+ [Arguments] ${service} ${catalog_service_name}=
+ ${directory_list}= Get From Dictionary ${GLOBAL_SERVICE_FOLDER_MAPPING} ${service}
+ ${ziplist}= Create List
+ :for ${directory} in @{directory_list}
+ \ ${zip}= Catenate ${ASDC_ZIP_DIRECTORY}/${directory}.zip
+ \ ${folder}= Catenate ${ASDC_ASSETS_DIRECTORY}/${directory}
+ \ OperatingSystem.Create Directory ${ASDC_ASSETS_DIRECTORY}/temp
+ \ Create Zip From Files In Directory ${folder} ${zip}
+ \ Append To List ${ziplist} ${zip}
+ ${catalog_service_name} ${catalog_resource_name} ${vf_modules} ${catalog_resource_ids} ${catalog_service_id} Distribute Model From ASDC ${ziplist} ${catalog_service_name}
+ Set Test Variable ${CATALOG_RESOURCE_IDS} ${catalog_resource_ids}
+ Set Test Variable ${CATALOG_SERVICE_ID} ${catalog_service_id}
+ [Return] ${catalog_service_name} ${catalog_resource_name} ${vf_modules}
+
+
+
+
+Teardown Model Distribution
+ [Documentation] Clean up at the end of the test
+ Log ${CATALOG_SERVICE_ID} ${CATALOG_RESOURCE_IDS}
+ Teardown Models ${CATALOG_SERVICE_ID} ${CATALOG_RESOURCE_IDS}
+
+Teardown Models
+ [Documentation] Clean up at the end of the test
+ [Arguments] ${catalog_service_id} ${catalog_resource_ids}
+ Return From Keyword If '${catalog_service_id}' == ''
+ :for ${catalog_resource_id} in @{catalog_resource_ids}
+ \ ${resourece_json}= Mark ASDC Catalog Resource Inactive ${catalog_resource_id}
+ ${service_json}= Mark ASDC Catalog Service Inactive ${catalog_service_id}
+ ${services_json}= Delete Inactive ASDC Catalog Services
+ ${resources_json}= Delete Inactive ASDC Catalog Resources
diff --git a/kubernetes/config/docker/init/src/config/robot/robot/resources/test_templates/vnf_orchestration_test_template.robot b/kubernetes/config/docker/init/src/config/robot/robot/resources/test_templates/vnf_orchestration_test_template.robot
new file mode 100644
index 0000000000..df1f123ce5
--- /dev/null
+++ b/kubernetes/config/docker/init/src/config/robot/robot/resources/test_templates/vnf_orchestration_test_template.robot
@@ -0,0 +1,160 @@
+*** Settings ***
+Documentation This test template encapsulates the VNF Orchestration use case.
+
+Resource ../vid/create_service_instance.robot
+Resource ../vid/vid_interface.robot
+Resource ../aai/service_instance.robot
+Resource ../vid/create_vid_vnf.robot
+Resource ../vid/teardown_vid.robot
+Resource ../sdngc_interface.robot
+Resource model_test_template.robot
+
+Resource ../aai/create_customer.robot
+Resource ../aai/create_tenant.robot
+Resource ../aai/create_service.robot
+Resource ../openstack/neutron_interface.robot
+Resource ../heatbridge.robot
+
+
+Library OpenstackLibrary
+Library ExtendedSelenium2Library
+Library UUID
+Library Collections
+
+
+
+*** Variables ***
+
+#**************** TEST CASE VARIABLES **************************
+${TENANT_NAME}
+${TENANT_ID}
+${REGIONS}
+${CUSTOMER_NAME}
+${STACK_NAME}
+${SERVICE}
+${VVG_SERVER_ID}
+${SERVICE_INSTANCE_ID}
+
+*** Keywords ***
+
+Orchestrate VNF
+ [Documentation] Use openECOMP to Orchestrate a service.
+ [Arguments] ${customer_name} ${service} ${product_family} ${tenant}
+ ${lcp_region}= Get Openstack Region
+ ${uuid}= Generate UUID
+ Set Test Variable ${CUSTOMER_NAME} ${customer_name}_${uuid}
+ Set Test Variable ${SERVICE} ${service}
+ ${vnf_name}= Catenate Vnf_Ete_Name${uuid}
+ ${service_name}= Catenate Service_Ete_Name${uuid}
+ ${service_type}= Set Variable ${service}
+ ${vf_module_name}= Catenate Vfmodule_Ete_Name${uuid}
+ ${service_model_type} ${vnf_type} ${vf_modules} = Model Distribution For Directory ${service}
+ Run Keyword If '${service}' == 'vVG' Create VVG Server ${uuid}
+ Create Customer For VNF ${CUSTOMER_NAME} ${CUSTOMER_NAME} INFRA ${service_type} ${GLOBAL_AAI_CLOUD_OWNER}
+ Setup Browser
+ Login To VID GUI
+ ${service_instance_id}= Create VID Service Instance ${customer_name} ${service_model_type} ${service} ${service_name}
+ Set Test Variable ${SERVICE_INSTANCE_ID} ${service_instance_id}
+ Validate Service Instance ${service_instance_id} ${service} ${customer_name}
+ Create VID VNF ${service_instance_id} ${vnf_name} ${product_family} ${lcp_region} ${tenant} ${vnf_type}
+ ${vf_module_type} ${closedloop_vf_module}= Preload Vnf ${service_instance_id} ${vnf_name} ${vnf_type} ${vf_module_name} ${vf_modules} ${service} ${uuid}
+ ${vf_module_id}= Create VID VNF module ${service_instance_id} ${vf_module_name} ${lcp_region} ${tenant} ${vf_module_type}
+ ${generic_vnf}= Validate Generic VNF ${vnf_name} ${vnf_type} ${service_instance_id}
+ VLB Closed Loop Hack ${service} ${generic_vnf} ${closedloop_vf_module}
+ Set Test Variable ${STACK_NAME} ${vf_module_name}
+ Execute Heatbridge ${vf_module_name} ${service_instance_id} ${service}
+ Validate VF Module ${vf_module_name} ${service}
+ [Return] ${vf_module_name} ${service}
+
+
+Create Customer For VNF
+ [Documentation] VNF Orchestration Test setup....
+ ... Create Tenant if not exists, Create Customer, Create Service and related relationships
+ [Arguments] ${customer_name} ${customer_id} ${customer_type} ${service_type} ${cloud_owner}
+ ${cloud_region_id}= Get Openstack Region
+ ${resp}= Create Customer ${customer_name} ${customer_id} ${customer_type} ${service_type} ${cloud_owner} ${cloud_region_id} ${TENANT_ID}
+ Should Be Equal As Strings ${resp} 201
+ Create Service If Not Exists ${service_type}
+
+Setup Orchestrate VNF
+ [Documentation] Called before each test case to ensure tenant and region data
+ ... required by the Orchstrate VNF exists in A&AI
+ [Arguments] ${cloud_owner} ${cloud_type} ${owner_defined_type} ${cloud_region_version} ${cloud_zone}
+ Initialize Tenant From Openstack
+ Initialize Regions From Openstack
+ :FOR ${region} IN @{REGIONS}
+ \ Inventory Tenant If Not Exists ${cloud_owner} ${region} ${cloud_type} ${owner_defined_type} ${cloud_region_version} ${cloud_zone} ${TENANT_ID} ${TENANT_NAME}
+ Log Orchestrate VNF setup complete
+
+Initialize Tenant From Openstack
+ [Documentation] Initialize the tenant test variables
+ Run Openstack Auth Request auth
+ ${tenants}= Get Current Openstack Tenant auth
+ ${tenant_name}= Evaluate $tenants.get("name")
+ ${tenant_id}= Evaluate $tenants.get("id")
+ Set Test Variable ${TENANT_NAME} ${tenant_name}
+ Set Test Variable ${TENANT_ID} ${tenant_id}
+
+Initialize Regions From Openstack
+ [Documentation] Initialize the regions test variable
+ Run Openstack Auth Request auth
+ ${regs}= Get Openstack Regions auth
+ Set Test Variable ${REGIONS} ${regs}
+
+Create VVG Server
+ [Documentation] For the VolumeGroup test case, create a server to attach the volume group to be orchestrated.
+ [Arguments] ${uuid}
+ Run Openstack Auth Request auth
+ ${vvg_server_name}= Catenate vVG_${uuid}
+ ${server}= Add Server For Image Name auth ${vvg_server_name} ${GLOBAL_VVGSERVER_IMAGE} ${GLOBAL_VVGSERVER_FLAVOR}
+ ${server}= Get From Dictionary ${server} server
+ ${server_id}= Get From Dictionary ${server} id
+ Set Test Variable ${VVG_SERVER_ID} ${server_id}
+ ${vvg_params}= Get VVG Preload Parameters
+ Set To Dictionary ${vvg_params} nova_instance ${server_id}
+ Wait for Server to Be Active auth ${server_id}
+
+Get VVG Preload Parameters
+ [Documentation] Get preload parameters for the VVG test case so we can include
+ ... the nova_instance id of the attached server
+ ${test_dict}= Get From Dictionary ${GLOBAL_PRELOAD_PARAMETERS} Vnf-Orchestration
+ ${vvg_params} Get From Dictionary ${test_dict} vvg_preload.template
+ [Return] ${vvg_params}
+
+Teardown VNF
+ [Documentation] Called at the end of a test case to tear down the VNF created by Orchestrate VNF
+ ${lcp_region}= Get Openstack Region
+ Teardown VVG Server
+ Run Keyword If '${TEST STATUS}' == 'PASS' Teardown VLB Closed Loop Hack
+ Run Keyword If '${TEST STATUS}' == 'PASS' Teardown VID ${SERVICE_INSTANCE_ID} ${lcp_region} ${TENANT_ID}
+ Run Keyword If '${TEST STATUS}' == 'PASS' Teardown Model Distribution
+ Run Keyword If '${TEST STATUS}' == 'PASS' Clean A&AI Inventory
+ Close All Browsers
+ Log Teardown VNF implemented for successful tests only
+
+Teardown VVG Server
+ [Documentation] Teardown the server created as a place to mount the Volume Group.
+ Return From Keyword if '${VVG_SERVER_ID}' == ''
+ Delete Server auth ${VVG_SERVER_ID}
+ Wait for Server To Be Deleted auth ${VVG_SERVER_ID}
+ ${vvg_params}= Get VVG Preload Parameters
+ Remove from Dictionary ${vvg_params} nova_instance
+ Log Teardown VVG Server Completed
+
+Teardown Stack
+ [Documentation] OBSOLETE - Called at the end of a test case to tear down the Stack created by Orchestrate VNF
+ [Arguments] ${stack}
+ Run Openstack Auth Request auth
+ ${stack_info}= Get Stack Details auth ${stack}
+ Log ${stack_info}
+ ${stack_id}= Get From Dictionary ${stack_info} id
+ ${key_pair_status} ${keypair_name}= Run Keyword And Ignore Error Get From Dictionary ${stack_info} key_name
+ Delete Openstack Stack auth ${stack} ${stack_id}
+ Log Deleted ${stack} ${stack_id}
+ Run Keyword If '${key_pair_status}' == 'PASS' Delete Openstack Keypair auth ${keypair_name}
+ Teardown VLB Closed Loop Hack
+
+Clean A&AI Inventory
+ [Documentation] Clean up Tenant in A&AI, Create Customer, Create Service and related relationships
+ Delete Customer ${CUSTOMER_NAME}
+
diff --git a/kubernetes/config/docker/init/src/config/robot/robot/resources/vid/create_service_instance.robot b/kubernetes/config/docker/init/src/config/robot/robot/resources/vid/create_service_instance.robot
new file mode 100644
index 0000000000..204b7d678c
--- /dev/null
+++ b/kubernetes/config/docker/init/src/config/robot/robot/resources/vid/create_service_instance.robot
@@ -0,0 +1,60 @@
+*** Settings ***
+Documentation Creates VID Service Instance
+...
+... Creates VID Service Instance
+
+Library ExtendedSelenium2Library
+Library UUID
+Library String
+Library DateTime
+
+Resource ../mso_interface.robot
+Resource vid_interface.robot
+
+*** Keywords ***
+Create VID Service Instance
+ [Documentation] Creates a service instance using VID
+ [Arguments] ${customer_name} ${service_model_type} ${service_type} ${service_name}
+ Go To VID HOME
+ Wait Until Keyword Succeeds 300s 1s Wait For Model ${service_model_type}
+ Press Key xpath=//tr[td/span/text() = '${service_model_type}']/td/button[text() = 'Deploy' and not(@disabled)] \\13
+ ${uuid}= Generate UUID
+ Wait Until Page Contains Element xpath=//input[@parameter-name='Instance Name'] 120s
+ Wait Until Element Is Visible xpath=//input[@parameter-name='Instance Name'] 120s
+ Xpath Should Match X Times //input[@parameter-name='Instance Name'] 1
+ Input Text When Enabled //input[@parameter-name='Instance Name'] ${service_name}
+ Select From List When Enabled //select[@prompt='Select Subscriber Name'] ${customer_name}
+ Select From List WHen Enabled //select[@prompt='Select Service Type'] ${service_type}
+ Click On Button When Enabled //div[@class = 'buttonRow']/button[text() = 'Confirm']
+ Wait Until Element Contains xpath=//div[@ng-controller= 'msoCommitController']/pre[@class = 'log ng-binding'] requestId timeout=120s
+ ${response text}= Get Text xpath=//div[@ng-controller= 'msoCommitController']/pre[@class = 'log ng-binding']
+ Click On Button When Enabled //div[@class = 'buttonRow']/button[text() = 'Close']
+ ${request_id}= Parse Request Id ${response text}
+ ${service_instance_id}= Parse Instance Id ${response text}
+ Poll MSO Get Request ${GLOBAL_MSO_STATUS_PATH}${request_id} COMPLETE
+ [return] ${service_instance_id}
+
+Wait For Model
+ [Documentation] Distributed model may not yet be available. Kepp trying until it shows up.
+ [Arguments] ${service_model_type}
+ Click Element partial link=Browse SDC Service
+ Page Should Contain Element xpath=//div/h1[text() = 'Browse SDC Service Models']
+ Wait Until Page Contains Element xpath=//button[text() = 'Deploy'] 240s
+ Input Text When Enabled //input[@ng-model='searchString'] ${service_model_type}
+ Wait Until Element Is Visible xpath=//tr[td/span/text() = '${service_model_type}']/td/button[contains(text(),'Deploy')] 10s
+
+Delete Service Instance By GUI
+ [Arguments] ${service_instance_id} ${customer_name}
+ Click On Element When Visible xpath=//a/span[@class='glyphicon glyphicon-remove']
+ Click On Button When Visible xpath=//div[@class='buttonRow']/button[@ngx-enabled='true']
+ Wait Until Element Contains xpath=//div[@ng-controller='deletionDialogController']//div[@ng-controller= 'msoCommitController']/pre[@class = 'log ng-binding'] requestId timeout=120s
+ ${response text}= Get Text xpath=//div[@ng-controller='deletionDialogController']//div[@ng-controller= 'msoCommitController']/pre[@class = 'log ng-binding']
+ ${request_id}= Parse Request Id ${response text}
+ Poll MSO Get Request ${GLOBAL_MSO_STATUS_PATH}${request_id} COMPLETE
+
+
+Search Service Instance
+ [Arguments] ${service_instance_id} ${customer_name}
+ Click Link xpath=//div[@heading = 'Search for Existing Service Instances']/a
+ Input Text When Enabled //input[@name='selectedServiceInstance'] ${service_instance_id}
+ Click On Button When Enabled //button[text() = 'Submit']
diff --git a/kubernetes/config/docker/init/src/config/robot/robot/resources/vid/create_vid_vnf.robot b/kubernetes/config/docker/init/src/config/robot/robot/resources/vid/create_vid_vnf.robot
new file mode 100644
index 0000000000..7417772f39
--- /dev/null
+++ b/kubernetes/config/docker/init/src/config/robot/robot/resources/vid/create_vid_vnf.robot
@@ -0,0 +1,122 @@
+*** Settings ***
+Documentation Creates VID VNF Instance
+
+Library ExtendedSelenium2Library 60
+Library UUID
+Library String
+Library DateTime
+Library RequestsLibrary
+
+Resource ../mso_interface.robot
+Resource vid_interface.robot
+
+*** Keywords ***
+
+Create VID VNF
+ [Documentation] Creates a VNF instance using VID for passed instance id with the passed service instance name
+ [Arguments] ${service_instance_id} ${service_instance_name} ${product_family} ${lcp_region} ${tenant} ${vnf_type}
+ Go To VID HOME
+ Click Link xpath=//div[@heading = 'Search for Existing Service Instances']/a
+ Wait Until Page Contains Please search by timeout=60s
+ #Wait Until Page Contains Element xpath=//div[@class='statusLine aaiHidden'] timeout=60s
+ #Wait Until Element Is Not Visible xpath=//div[@class='statusLine aaiHidden'] timeout=60s
+
+ # If we don't wait for this control to be enabled, the submit results in a 'not found' pop-up (UnexpectedAlertPresentException)
+ Input Text When Enabled //input[@name='selectedServiceInstance'] ${service_instance_id}
+ Click Button button=Submit
+ Wait Until Page Contains Element link=View/Edit timeout=60s
+ Click Element xpath=//a[contains(text(), 'View/Edit')]
+ Wait Until Page Contains View/Edit Service Instance timeout=60s
+ #Wait Until Page Contains Element xpath=//div[@class='statusLine aaiVisible'] timeout=120s
+ #Wait Until Element Is Not Visible xpath=//div[@class='statusLine aaiVisible'] timeout=60s
+ Click Element button=Add VNF
+
+ # This is where firefox breaks. Th elink never becomes visible when run with the script.
+ Click Element link=${vnf_type}
+ Wait Until Page Contains Element xpath=//input[@parameter-id='instanceName'] 20s
+ Wait Until Element Is Enabled xpath=//input[@parameter-id='instanceName'] 20s
+
+ ## Without this sleep, the input text below gets immediately wiped out.
+ ## Wait Until Angular Ready just sleeps for its timeout value
+ Sleep 10s
+ Input Text xpath=//input[@parameter-id='instanceName'] ${service_instance_name}
+ Select From List By Label xpath=//select[@parameter-id='productFamily'] ${product_family}
+ Select From List By Label xpath=//select[@parameter-id='lcpRegion'] ${lcp_region}
+ Select From List By Label xpath=//select[@parameter-id='tenant'] ${tenant}
+ Click Element button=Confirm
+ Wait Until Element Contains xpath=//div[@ng-controller= 'msoCommitController']/pre[@class = 'log ng-binding'] Status: OK (200) timeout=120
+ ${response text}= Get Text xpath=//div[@ng-controller= 'msoCommitController']/pre[@class = 'log ng-binding']
+ Should Not Contain ${response text} FAILED
+ Click Element button=Close
+ ${instance_id}= Parse Instance Id ${response text}
+ Wait Until Page Contains ${service_instance_name} 60s
+ [Return] ${instance_id}
+
+Delete VID VNF
+ [Arguments] ${service_instance_id} ${lcp_region} ${tenant} ${vnf_instance_id}
+ Go To VID HOME
+ Click Link xpath=//div[@heading = 'Search for Existing Service Instances']/a
+ Wait Until Page Contains Please search by timeout=60s
+ Wait Until Page Contains Element xpath=//div[@class='statusLine aaiHidden'] timeout=60s
+ Wait Until Element Is Not Visible xpath=//div[@class='statusLine aaiHidden'] timeout=60s
+
+ # If we don't wait for this control to be enabled, the submit results in a 'not found' pop-up (UnexpectedAlertPresentException)
+ Input Text When Enabled //input[@name='selectedServiceInstance'] ${service_instance_id}
+ Click Button button=Submit
+ Wait Until Page Contains Element link=View/Edit timeout=60s
+ Click Element link=View/Edit
+ Wait Until Page Contains View/Edit Service Instance timeout=60s
+ Wait Until Page Contains Element xpath=//div[@class='statusLine'] timeout=120s
+ Wait Until Element Is Not Visible xpath=//div[@class='statusLine aaiHidden'] timeout=60s
+
+
+
+ Click On Element When Visible xpath=//li/div[contains(.,'${vnf_instance_id}')]/a/span[@class='glyphicon glyphicon-remove'] timeout=120s
+ Select From List By Label xpath=//select[@parameter-id='lcpRegion'] ${lcp_region}
+ Select From List By Label xpath=//select[@parameter-id='tenant'] ${tenant}
+ Click Element xpath=//div[@class='buttonRow']/button[@ngx-enabled='true']
+ #//*[@id="mContent"]/div/div/div/div/table/tbody/tr/td/div/div[2]/div/div[1]/div[5]/button[1]
+
+ ${response text}= Get Text xpath=//div[@ng-controller='deletionDialogController']//div[@ng-controller= 'msoCommitController']/pre[@class = 'log ng-binding']
+ ${request_id}= Parse Request Id ${response text}
+ Poll MSO Get Request ${GLOBAL_MSO_STATUS_PATH}${request_id} COMPLETE
+
+Create VID VNF module
+ [Arguments] ${service_instance_id} ${vf_module_name} ${lcp_region} ${TENANT} ${VNF_TYPE}
+ Go To VID HOME
+ Click Link xpath=//div[@heading = 'Search for Existing Service Instances']/a
+ Wait Until Page Contains Please search by timeout=60s
+ Wait Until Page Contains Element xpath=//div[@class='statusLine aaiHidden'] timeout=60s
+
+ # If we don't wait for this control to be enabled, the submit results in a 'not found' pop-up (UnexpectedAlertPresentException)
+ Input Text When Enabled //input[@name='selectedServiceInstance'] ${service_instance_id}
+ Click Button button=Submit
+ Wait Until Page Contains Element link=View/Edit timeout=60s
+ Click Element link=View/Edit
+ Wait Until Page Contains View/Edit Service Instance timeout=60s
+ Wait Until Page Contains Element xpath=//div[@class='statusLine'] timeout=120s
+ Wait Until Element Is Not Visible xpath=//div[@class='statusLine aaiHidden'] timeout=120s
+ Wait Until Element Is Visible button=Add VF-Module timeout=120s
+ Click Element button=Add VF-Module
+
+ # This is where firefox breaks. Th elink never becomes visible when run with the script.
+ Click Element link=${vnf_type}
+ Wait Until Page Contains Element xpath=//input[@parameter-id='instanceName'] 20s
+ Wait Until Element Is Enabled xpath=//input[@parameter-id='instanceName'] 20s
+
+ ## Without this sleep, the input text below gets immediately wiped out.
+ ## Wait Until Angular Ready just sleeps for its timeout value
+ Sleep 10s
+ Input Text xpath=//input[@parameter-id='instanceName'] ${vf_module_name}
+ Select From List By Label xpath=//select[@parameter-id='lcpRegion'] ${lcp_region}
+ Select From List By Label xpath=//select[@parameter-id='tenant'] ${tenant}
+ Click Element button=Confirm
+ Wait Until Element Contains xpath=//div[@ng-controller= 'msoCommitController']/pre[@class = 'log ng-binding'] requestId timeout=120
+ ${response text}= Get Text xpath=//div[@ng-controller= 'msoCommitController']/pre[@class = 'log ng-binding']
+ Click Element button=Close
+ ${instance_id}= Parse Instance Id ${response text}
+
+ ${request_id}= Parse Request Id ${response text}
+ Poll MSO Get Request ${GLOBAL_MSO_STATUS_PATH}${request_id} COMPLETE
+
+ [Return] ${instance_id} \ No newline at end of file
diff --git a/kubernetes/config/docker/init/src/config/robot/robot/resources/vid/teardown_vid.robot b/kubernetes/config/docker/init/src/config/robot/robot/resources/vid/teardown_vid.robot
new file mode 100644
index 0000000000..88408546d5
--- /dev/null
+++ b/kubernetes/config/docker/init/src/config/robot/robot/resources/vid/teardown_vid.robot
@@ -0,0 +1,91 @@
+*** Settings ***
+Documentation The main interface for interacting with VID. It handles low level stuff like managing the selenium request library and VID required steps
+Library ExtendedSelenium2Library
+Library Collections
+Library String
+Library StringTemplater
+Library UUID
+Resource vid_interface.robot
+Resource create_vid_vnf.robot
+Resource create_service_instance.robot
+
+*** Variables ***
+${VID_ENV} /vid
+${VID_SERVICE_MODELS_SEARCH_CUST} ${GLOBAL_VID_SERVER}${VID_ENV}/serviceModels.htm#/instances/subdetails?selectedSubscriber=\${customer_id}
+${VID_SERVICE_MODELS_SEARCH_URL} ${GLOBAL_VID_SERVER}${VID_ENV}/serviceModels.htm#/instances/services
+*** Keywords ***
+
+Teardown VID
+ [Documentation] Teardown the VID This assumes that the any runnign stacks have been torn down
+ [Arguments] ${service_instance_id} ${lcp_region} ${tenant}
+ Return From Keyword If len('${service_instance_id}') == 0
+ # Keep going to the VID service instance until we get the pop-up alert that there is no service instance
+ Wait Until Keyword Succeeds 300s 1s Delete VID ${service_instance_id} ${lcp_region} ${tenant}
+
+
+Delete VID
+ [Documentation] Teardown the next VID entity that has a Remove icon.
+ [Arguments] ${service_instance_id} ${lcp_region} ${tenant}
+ # For vLB closed loop, we may have 2 vf modules and the vDNS one needs to be removed first.
+ ${remove_order}= Create List vDNS_Ete Vfmodule_Ete
+
+ # FAIL status is returned in ${vfmodule} because FAIL are ignored during teardown
+ ${status} ${vfmodule}= Run Keyword and Ignore Error Delete Next VID Entity ${service_instance_id} ${lcp_region} ${tenant} ${remove_order}
+ Return From Keyword If '${status}' == 'FAIL'
+ Return From Keyword If '${vfmodule}' == 'FAIL'
+ # After tearing down a VF module, execute the reverse HB for it to remove the references from A&AI
+ Run Keyword If 'Vfmodule_Ete' in '${vfmodule}' Execute Reverse Heatbridge
+ Fail Continue with Next Remove
+
+Delete Next VID Entity
+ [Documentation] Teardown the next VID entity that has a Remove icon.
+ [Arguments] ${service_instance_id} ${lcp_region} ${tenant} ${remove_order}
+ ${vfmodule}= Catenate
+ Go To ${VID_SERVICE_MODELS_SEARCH_URL}
+ Wait Until Page Contains Please search by timeout=60s
+ Wait Until Page Contains Element xpath=//div[@class='statusLine aaiHidden'] timeout=60s
+ Wait Until Element Is Not Visible xpath=//div[@class='statusLine aaiHidden'] timeout=60s
+
+ # If we don't wait for this control to be enabled, the submit results in a 'not found' pop-up (UnexpectedAlertPresentException)
+ Input Text When Enabled //input[@name='selectedServiceInstance'] ${service_instance_id}
+
+ # When Handle alert detects a pop-up. it will return FAIL and we are done
+ # Return from Keyword is required because FAIL is inored during teardown
+ ${status} ${value} Run Keyword And Ignore Error Handle Alert
+ Return From Keyword If '${status}' == 'FAIL' ${status}
+ ${status} ${value} Run Keyword And Ignore Error Wait Until Page Contains Element link=View/Edit timeout=60s
+ Return From Keyword If '${status}' == 'FAIL' ${status}
+
+
+ Click Element link=View/Edit
+ Wait Until Page Contains View/Edit Service Instance timeout=60s
+ Wait Until Element Is Visible xpath=//a/span[@class='glyphicon glyphicon-remove'] timeout=120s
+
+ :for ${remove_first} in @{remove_order}
+ \ ${remove_xpath}= Set Variable //li/div[contains(.,'${remove_first}')]/a/span[@class='glyphicon glyphicon-remove']
+ \ ${status} ${data}= Run Keyword And Ignore Error Page Should Contain Element xpath=${remove_xpath}
+ \ Exit For Loop If '${status}' == 'PASS'
+ \ ${remove_xpath}= Set Variable //li/div/a/span[@class='glyphicon glyphicon-remove']
+ Click On Element When Visible xpath=${remove_xpath}
+
+ ${status} ${value}= Run Keyword and Ignore Error Wait Until Page Contains Element xpath=//select[@parameter-id='lcpRegion']
+ Run Keyword If '${status}'=='PASS' Select From List By Label xpath=//select[@parameter-id='lcpRegion'] ${lcp_region}
+ Run Keyword If '${status}'=='PASS' Select From List By Label xpath=//select[@parameter-id='tenant'] ${tenant}
+ ${status} ${vfmodule}= Run Keyword And Ignore Error Get Text xpath=//td[contains(text(), 'Vf Module Name')]/../td[2]
+ Click Element xpath=//div[@class='buttonRow']/button[@ngx-enabled='true']
+ #//*[@id="mContent"]/div/div/div/div/table/tbody/tr/td/div/div[2]/div/div[1]/div[5]/button[1]
+ Wait Until Page Contains 100 % 300s
+ ${response text}= Get Text xpath=//div[@ng-controller='deletionDialogController']//div[@ng-controller= 'msoCommitController']/pre[@class = 'log ng-binding']
+ ${request_id}= Parse Request Id ${response text}
+ Click Element xpath=//div[@class='ng-scope']/div[@class = 'buttonRow']/button[text() = 'Close']
+ Poll MSO Get Request ${GLOBAL_MSO_STATUS_PATH}${request_id} COMPLETE
+ [Return] ${vfmodule}
+
+Handle Alert
+ [Documentation] When service instance has been deleted, an alert will be triggered on the search to end the loop
+ ... The various Alert keywords did not prevent the alert exception on the Click ELement, hence this roundabout way of handling the alert
+ Run Keyword And Ignore Error Click Element button=Submit
+ ${status} ${t}= Run Keyword And Ignore Error Get Alert Message
+ Return From Keyword If '${status}' == 'FAIL'
+ Fail ${t}
+ \ No newline at end of file
diff --git a/kubernetes/config/docker/init/src/config/robot/robot/resources/vid/vid_interface.robot b/kubernetes/config/docker/init/src/config/robot/robot/resources/vid/vid_interface.robot
new file mode 100644
index 0000000000..78b81484c8
--- /dev/null
+++ b/kubernetes/config/docker/init/src/config/robot/robot/resources/vid/vid_interface.robot
@@ -0,0 +1,101 @@
+*** Settings ***
+Documentation The main interface for interacting with VID. It handles low level stuff like managing the selenium request library and VID required steps
+Library ExtendedSelenium2Library
+Library Collections
+Library String
+Library RequestsLibrary
+Library UUID
+Resource ../global_properties.robot
+Resource ../browser_setup.robot
+
+*** Variables ***
+${VID_ENV} /vid
+${VID_LOGIN_URL} ${GLOBAL_VID_SERVER}${VID_ENV}/login_external.htm
+${VID_HEALTHCHECK_PATH} ${VID_ENV}/api/users
+${VID_HOME_URL} ${GLOBAL_VID_SERVER}${VID_ENV}/vidhome.htm
+
+*** Keywords ***
+Run VID Health Check
+ [Documentation] Logs in to VID GUI
+ ${resp}= Run VID Get Request ${VID_HEALTHCHECK_PATH}
+ Should Be Equal As Strings ${resp.status_code} 200
+ Should Be String ${resp.json()[0]['loginId']}
+
+Run VID Get Request
+ [Documentation] Runs an VID get request
+ [Arguments] ${data_path}
+ ${auth}= Create List ${GLOBAL_VID_HEALTH_USERNAME} ${GLOBAL_VID_HEALTH_PASSWORD}
+ Log Creating session ${GLOBAL_VID_SERVER}
+ ${session}= Create Session vid ${GLOBAL_VID_SERVER} auth=${auth}
+ ${uuid}= Generate UUID
+ ${headers}= Create Dictionary username=${GLOBAL_VID_HEALTH_USERNAME} password=${GLOBAL_VID_HEALTH_PASSWORD} Accept=application/json Content-Type=application/json X-TransactionId=${GLOBAL_APPLICATION_ID}-${uuid} X-FromAppId=${GLOBAL_APPLICATION_ID}
+ ${resp}= Get Request vid ${data_path} headers=${headers}
+ Log Received response from vid ${resp.text}
+ [Return] ${resp}
+
+Login To VID GUI
+ [Documentation] Logs in to VID GUI
+ # Setup Browser Now being managed by test case
+ ##Setup Browser
+ Go To ${VID_LOGIN_URL}
+ Maximize Browser Window
+ Set Selenium Speed ${GLOBAL_SELENIUM_DELAY}
+ Set Browser Implicit Wait ${GLOBAL_SELENIUM_BROWSER_IMPLICIT_WAIT}
+ Log Logging in to ${GLOBAL_VID_SERVER}${VID_ENV}
+ Handle Proxy Warning
+ Title Should Be VID Login
+ Input Text xpath=//input[@ng-model='loginId'] ${GLOBAL_VID_USERNAME}
+ Input Password xpath=//input[@ng-model='password'] ${GLOBAL_VID_PASSWORD}
+ Click Button xpath=//input[@id='loginBtn']
+ Wait Until Page Contains Element xpath=//div[@class='applicationWindow'] ${GLOBAL_SELENIUM_BROWSER_WAIT_TIMEOUT}
+ Log Logged in to ${GLOBAL_VID_SERVER}${VID_ENV}
+
+Go To VID HOME
+ [Documentation] Naviage to VID Home
+ Go To ${VID_HOME_URL}
+ Wait Until Page Contains Element xpath=//div[@class='applicationWindow'] ${GLOBAL_SELENIUM_BROWSER_WAIT_TIMEOUT}
+
+Click On Button When Enabled
+ [Arguments] ${xpath} ${timeout}=60s
+ Wait Until Page Contains Element xpath=${xpath} ${timeout}
+ Wait Until Element Is Enabled xpath=${xpath} ${timeout}
+ Click Button xpath=${xpath}
+
+Click On Button When Visible
+ [Arguments] ${xpath} ${timeout}=60s
+ Wait Until Page Contains Element xpath=${xpath} ${timeout}
+ Wait Until Element Is Visible xpath=${xpath} ${timeout}
+ Click Button xpath=${xpath}
+
+Click On Element When Visible
+ [Arguments] ${xpath} ${timeout}=60s
+ Wait Until Page Contains Element xpath=${xpath} ${timeout}
+ Wait Until Element Is Visible xpath=${xpath} ${timeout}
+ Click Element xpath=${xpath}
+
+Select From List When Enabled
+ [Arguments] ${xpath} ${value} ${timeout}=60s
+ Wait Until Page Contains Element xpath=${xpath} ${timeout}
+ Wait Until Element Is Enabled xpath=${xpath} ${timeout}
+ Select From List xpath=${xpath} ${value}
+
+Input Text When Enabled
+ [Arguments] ${xpath} ${value} ${timeout}=60s
+ Wait Until Page Contains Element xpath=${xpath} ${timeout}
+ Wait Until Element Is Enabled xpath=${xpath} ${timeout}
+ Input Text xpath=${xpath} ${value}
+
+Parse Request Id
+ [Arguments] ${mso_response_text}
+ ${request_list}= Split String ${mso_response_text} 202)\n 1
+ ${clean_string}= Replace String ${request_list[1]} \n ${empty}
+ ${json}= To Json ${clean_string}
+ ${request_id}= Catenate ${json['requestReferences']['requestId']}
+ [Return] ${request_id}
+
+Parse Instance Id
+ [Arguments] ${mso_response_text}
+ ${request_list}= Split String ${mso_response_text} 202)\n 1
+ ${json}= To Json ${request_list[1]}
+ ${request_id}= Catenate ${json['requestReferences']['instanceId']}
+ [Return] ${request_id} \ No newline at end of file
diff --git a/kubernetes/config/docker/init/src/config/robot/robot/testsuites/closed-loop.robot b/kubernetes/config/docker/init/src/config/robot/robot/testsuites/closed-loop.robot
new file mode 100644
index 0000000000..e36be8945e
--- /dev/null
+++ b/kubernetes/config/docker/init/src/config/robot/robot/testsuites/closed-loop.robot
@@ -0,0 +1,15 @@
+*** Settings ***
+Documentation Closed Loop Test cases
+
+Resource ../resources/test_templates/closedloop_test_template.robot
+
+Test Teardown Teardown Closed Loop
+
+*** Test Cases ***
+
+VFW Closed Loop Test
+ [TAGS] ete closedloop
+ VFW Policy
+VDNS Closed Loop Test
+ [TAGS] ete closedloop
+ VDNS Policy \ No newline at end of file
diff --git a/kubernetes/config/docker/init/src/config/robot/robot/testsuites/demo.robot b/kubernetes/config/docker/init/src/config/robot/robot/testsuites/demo.robot
new file mode 100644
index 0000000000..f5788d506a
--- /dev/null
+++ b/kubernetes/config/docker/init/src/config/robot/robot/testsuites/demo.robot
@@ -0,0 +1,43 @@
+*** Settings ***
+Documentation Executes the VNF Orchestration Test cases including setup and teardown
+...
+Library Collections
+Resource ../resources/demo_preload.robot
+*** Variables ***
+
+${VNF_NAME} DemoVNF
+${MODULE_NAME} DemoModuleName
+
+*** Test Cases ***
+Initialize Customer And Models
+ [Tags] InitDemo
+ Load Customer And Models Demonstration
+
+Initialize Customer
+ [Tags] InitCustomer
+ Load Customer Demonstration
+
+Initialize Models
+ [Tags] InitDistribution
+ Load Models Demonstration
+
+Preload VNF
+ [Tags] PreloadDemo
+ Preload User Model ${VNF_NAME} ${MODULE_NAME}
+
+Create APPC Mount Point
+ [Tags] APPCMountPointDemo
+ APPC Mount Point ${MODULE_NAME}
+
+Instantiate VFW
+ [Tags] instantiateVFW
+ Instantiate VNF vFW
+
+Delete Instantiated VNF
+ [Documentation] This test assumes all necessary variables are loaded via the variable file create in Save For Delete
+ ... The Teardown VNF needs to be in the teardown step of the test case...
+ [Tags] deleteVNF
+ Setup Browser
+ Login To VID GUI
+ [Teardown] Teardown VNF
+
diff --git a/kubernetes/config/docker/init/src/config/robot/robot/testsuites/health-check.robot b/kubernetes/config/docker/init/src/config/robot/robot/testsuites/health-check.robot
new file mode 100644
index 0000000000..d27c38e555
--- /dev/null
+++ b/kubernetes/config/docker/init/src/config/robot/robot/testsuites/health-check.robot
@@ -0,0 +1,57 @@
+*** Settings ***
+Documentation Testing ecomp components are available via calls.
+...
+... Testing ecomp components are available via calls.
+
+Resource ../resources/dcae_interface.robot
+Resource ../resources/sdngc_interface.robot
+Resource ../resources/aai/aai_interface.robot
+Resource ../resources/vid/vid_interface.robot
+Resource ../resources/policy_interface.robot
+Resource ../resources/mso_interface.robot
+Resource ../resources/asdc_interface.robot
+Resource ../resources/appc_interface.robot
+Resource ../resources/portal_interface.robot
+Resource ../resources/mr_interface.robot
+Resource ../resources/aaf_interface.robot
+
+*** Test Cases ***
+Basic DCAE Health Check
+ [Tags] health
+ Run DCAE Health Check
+
+Basic SDNGC Health Check
+ [Tags] health
+ Run SDNGC Health Check
+
+Basic A&AI Health Check
+ [Tags] health
+ Run A&AI Health Check
+
+Basic Policy Health Check
+ [Tags] health
+ Run Policy Health Check
+
+Basic MSO Health Check
+ [Tags] health
+ Run MSO Health Check
+
+Basic ASDC Health Check
+ [Tags] health
+ Run ASDC Health Check
+
+Basic APPC Health Check
+ [Tags] health
+ Run APPC Health Check
+
+Basic Portal Health Check
+ [Tags] health
+ Run Portal Health Check
+
+Basic Message Router Health Check
+ [Tags] health
+ Run MR Health Check
+
+Basic VID Health Check
+ [Tags] health
+ Run VID Health Check
diff --git a/kubernetes/config/docker/init/src/config/robot/robot/testsuites/model-distribution.robot b/kubernetes/config/docker/init/src/config/robot/robot/testsuites/model-distribution.robot
new file mode 100644
index 0000000000..f1ce407ce7
--- /dev/null
+++ b/kubernetes/config/docker/init/src/config/robot/robot/testsuites/model-distribution.robot
@@ -0,0 +1,22 @@
+*** Settings ***
+Documentation Testing asdc.
+Library OperatingSystem
+Library RequestsLibrary
+Library Collections
+Library UUID
+Library ExtendedSelenium2Library
+Resource ../resources/test_templates/model_test_template.robot
+
+Test Template Model Distribution For Directory
+Test Teardown Teardown Model Distribution
+
+*** Variables ***
+
+*** Test Cases ***
+Distribute vLB Model vLB
+ [Tags] ete distribute
+Distribute vFW Model vFW
+ [Tags] ete distribute
+Distribute vVG Model vVG
+ [Tags] ete distribute
+
diff --git a/kubernetes/config/docker/init/src/config/robot/robot/testsuites/update_onap_page.robot b/kubernetes/config/docker/init/src/config/robot/robot/testsuites/update_onap_page.robot
new file mode 100644
index 0000000000..b0a7410f9d
--- /dev/null
+++ b/kubernetes/config/docker/init/src/config/robot/robot/testsuites/update_onap_page.robot
@@ -0,0 +1,92 @@
+*** Settings ***
+Documentation Initializes ONAP Test Web Page and Password
+
+Library Collections
+Library OperatingSystem
+Library StringTemplater
+Resource ../resources/openstack/keystone_interface.robot
+Resource ../resources/openstack/nova_interface.robot
+
+
+Test Timeout 1 minutes
+
+*** Variables ***
+${URLS_HTML_TEMPLATE} robot/assets/templates/web/index.html.template
+
+
+${WEB_USER} test
+${WEB_PASSWORD}
+
+${URLS_HTML} html/index.html
+${CREDENTIALS_FILE} /etc/lighttpd/authorization
+#${CREDENTIALS_FILE} authorization
+
+*** Test Cases ***
+Update ONAP Page
+ [Tags] UpdateWebPage
+ Run Keyword If '${WEB_PASSWORD}' == '' Fail "WEB Password must not be empty"
+ Run Openstack Auth Request auth
+ ${server_map}= Get Openstack Servers auth
+ ${oam_ip_map}= Create Dictionary
+ Set To Dictionary ${oam_ip_map} 10.0.0.1=onapdns
+ Set To Dictionary ${oam_ip_map} aai-service.onap-aai=aai
+ Set To Dictionary ${oam_ip_map} sdnhost.onap-appc=appc
+ Set To Dictionary ${oam_ip_map} 10.0.3.1=sdc
+ Set To Dictionary ${oam_ip_map} 10.0.4.1=dcae_controller
+ Set To Dictionary ${oam_ip_map} 10.0.4.105=dcae_cdap
+ Set To Dictionary ${oam_ip_map} 10.0.4.102=dcae_coll
+ Set To Dictionary ${oam_ip_map} mso.onap-mso=mso
+ Set To Dictionary ${oam_ip_map} drools.onap-policy=policy
+ Set To Dictionary ${oam_ip_map} sdnhost.onap-sdnc=sdnc
+ Set To Dictionary ${oam_ip_map} vid-server.onap-vid=vid
+ Set To Dictionary ${oam_ip_map} portalapps.onap-portal=portal
+ Set To Dictionary ${oam_ip_map} robot-openecompete.onap-robot=robot
+ Set To Dictionary ${oam_ip_map} dmaap.onap-message-router=message_router
+
+ ${values}= Create Dictionary
+ ${keys}= Get Dictionary Keys ${oam_ip_map}
+ :for ${oam_ip} in @{keys}
+ \ ${value_name}= Get From Dictionary ${oam_ip_map} ${oam_ip}
+ \ Set Public Ip ${server_map} ${oam_ip} ${value_name} ${values}
+ Log ${values}
+ Run Keyword If '${WEB_PASSWORD}' != '' Create File ${CREDENTIALS_FILE} ${WEB_USER}:${WEB_PASSWORD}
+ Create File From Template ${URLS_HTML_TEMPLATE} ${URLS_HTML} ${values}
+
+*** Keywords ***
+Create File From Template
+ [Arguments] ${template} ${file} ${values}
+ ${data} OperatingSystem.Get File ${template}
+ ${data}= Template String ${data} ${values}
+ Create File ${file} ${data}
+
+Set Public Ip
+ [Arguments] ${server_map} ${oam_ip} ${value_name} ${values}
+ ${status} ${public_ip}= Run Keyword And Ignore Error Get Public Ip ${server_map} ${oam_ip}
+ ${public_ip}= Set Variable If '${status}' == 'PASS' ${public_ip} ${oam_ip}
+ Set To Dictionary ${values} ${value_name} ${public_ip}
+
+Get Public Ip
+ [Arguments] ${server_map} ${oam_ip}
+ ${servers} Get Dictionary Values ${server_map}
+ :for ${server} in @{servers}
+ \ ${status} ${public_ip} Run Keyword And Ignore Error Search Addresses ${server} ${oam_ip}
+ \ Return From Keyword If '${status}' == 'PASS' ${public_ip}
+ Fail ${oam_ip} Server Not Found
+
+Search Addresses
+ [Arguments] ${server} ${oam_ip}
+ ${addresses} Get From Dictionary ${server} addresses
+ ${public_ips} Get From Dictionary ${addresses} public
+ ${public_ip}= Get V4 IP ${public_ips}
+ ${oam_ips} Get From Dictionary ${addresses} ${GLOBAL_VM_PROPERTIES['network']}
+ ${this_oam_ip}= Get V4 IP ${oam_ips}
+ Return From Keyword If '${this_oam_ip}' == '${oam_ip}' ${public_ip}
+ Fail ${oam_ip} Server Not Found
+
+Get V4 IP
+ [Arguments] ${ipmaps}
+ :for ${ipmap} in @{ipmaps}
+ \ ${ip} Get From Dictionary ${ipmap} addr
+ \ ${version} Get From Dictionary ${ipmap} version
+ \ Return from Keyword if '${version}' == '4' ${ip}
+ Fail No Version 4 IP
diff --git a/kubernetes/config/docker/init/src/config/robot/robot/testsuites/vnf-orchestration.robot b/kubernetes/config/docker/init/src/config/robot/robot/testsuites/vnf-orchestration.robot
new file mode 100644
index 0000000000..48f3964cf5
--- /dev/null
+++ b/kubernetes/config/docker/init/src/config/robot/robot/testsuites/vnf-orchestration.robot
@@ -0,0 +1,22 @@
+*** Settings ***
+Documentation Executes the VNF Orchestration Test cases including setup and teardown
+...
+
+Resource ../resources/test_templates/vnf_orchestration_test_template.robot
+
+Test Setup Setup Orchestrate VNF ${GLOBAL_AAI_CLOUD_OWNER} SharedNode OwnerType v1 CloudZone
+Test Template Orchestrate VNF
+Test Teardown Teardown VNF
+
+*** Test Cases *** CUSTOMER SERVICE PRODUCT_FAMILY TENANT
+Instantiate Virtual Firewall ETE_Customer vFW vFW ${TENANT_NAME}
+ [Tags] ete instantiate
+Instantiate Virtual DNS ETE_Customer vLB vLB ${TENANT_NAME}
+ [Tags] ete instantiate
+Instantiate Virtual Volume Group ETE_Customer vVG vVG ${TENANT_NAME}
+ [Tags] ete instantiate
+
+
+
+
+