summaryrefslogtreecommitdiffstats
path: root/robot/resources/stack_validation
diff options
context:
space:
mode:
Diffstat (limited to 'robot/resources/stack_validation')
-rw-r--r--robot/resources/stack_validation/darkstat_interface.robot82
-rw-r--r--robot/resources/stack_validation/packet_generator_interface.robot98
-rw-r--r--robot/resources/stack_validation/policy_check_vfw.robot95
-rw-r--r--robot/resources/stack_validation/validate_common.robot51
-rw-r--r--robot/resources/stack_validation/validate_dns_scaling.robot43
-rw-r--r--robot/resources/stack_validation/validate_vfw.robot94
-rw-r--r--robot/resources/stack_validation/validate_vlb.robot60
-rw-r--r--robot/resources/stack_validation/validate_vvg.robot17
8 files changed, 540 insertions, 0 deletions
diff --git a/robot/resources/stack_validation/darkstat_interface.robot b/robot/resources/stack_validation/darkstat_interface.robot
new file mode 100644
index 00000000..3537408a
--- /dev/null
+++ b/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/robot/resources/stack_validation/packet_generator_interface.robot b/robot/resources/stack_validation/packet_generator_interface.robot
new file mode 100644
index 00000000..cc9ba04f
--- /dev/null
+++ b/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/robot/resources/stack_validation/policy_check_vfw.robot b/robot/resources/stack_validation/policy_check_vfw.robot
new file mode 100644
index 00000000..a1ed3fa3
--- /dev/null
+++ b/robot/resources/stack_validation/policy_check_vfw.robot
@@ -0,0 +1,95 @@
+*** 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
+
+
+*** Variables ***
+${ASSETS} ${EXECDIR}/robot/assets/
+
+*** Keywords ***
+Policy Check Firewall Stack
+ [Documentation] Identifies the firewall servers in the VFW Stack in the GLOBAL_OPENSTACK_SERVICE_REGION
+ [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] Identifies the firewall servers in the VFW Stack in the GLOBAL_OPENSTACK_SERVICE_REGION
+ [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}
+ # 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/robot/resources/stack_validation/validate_common.robot b/robot/resources/stack_validation/validate_common.robot
new file mode 100644
index 00000000..eb7f9f5a
--- /dev/null
+++ b/robot/resources/stack_validation/validate_common.robot
@@ -0,0 +1,51 @@
+*** 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 ***
+${ASSETS} ${EXECDIR}/robot/assets/
+${VFW_STACK_NAME} EcompETE_VFWStack
+${VLB_STACK_NAME} EcompETE_VLBStack
+${DNS_STACK_NAME} EcompETE_DNSStack
+
+*** 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 ${ASSETS}keys/robot_ssh_private_key.pvt
+ 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/robot/resources/stack_validation/validate_dns_scaling.robot b/robot/resources/stack_validation/validate_dns_scaling.robot
new file mode 100644
index 00000000..f63479ea
--- /dev/null
+++ b/robot/resources/stack_validation/validate_dns_scaling.robot
@@ -0,0 +1,43 @@
+*** 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 ***
+${ASSETS} ${EXECDIR}/robot/assets/
+
+*** Keywords ***
+Validate Dns Scaling Stack
+ [Documentation] Identifies the servers in the STACK_NAME in the GLOBAL_OPENSTACK_SERVICE_REGION
+ [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}
+ #${vpg_unprotected_ip}= Get From Dictionary ${stack_info} vpg_private_ip_0
+ #${vsn_protected_ip}= Get From Dictionary ${stack_info} vsn_private_ip_0
+ ${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 defined firewall processes to come up
+ [Arguments] ${ip}
+ Wait for Process on Host java DNSServer ${ip}
+
diff --git a/robot/resources/stack_validation/validate_vfw.robot b/robot/resources/stack_validation/validate_vfw.robot
new file mode 100644
index 00000000..51f29b4a
--- /dev/null
+++ b/robot/resources/stack_validation/validate_vfw.robot
@@ -0,0 +1,94 @@
+*** 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 ***
+${ASSETS} ${EXECDIR}/robot/assets/
+
+*** Keywords ***
+Validate Firewall Stack
+ [Documentation] Identifies the firewall servers in the VFW Stack in the GLOBAL_OPENSTACK_SERVICE_REGION
+ [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
+ ${appc}= Create Mount Point In APPC ${vpg_name_0} ${vpg_public_ip}
+
+ # Following hack was implemented because the stack doesn't always come up clean
+ # It was found that rebooting the servers at this point did not improve the
+ # chances of the packets flowing to the SNK
+ #${status} ${data}= Run Keyword And Ignore Error Wait For Packets ${vpg_public_ip} ${vpg_unprotected_ip} ${vsn_protected_ip} ${vsn_public_ip}
+ #Return From Keyword if '${status}' == 'PASS'
+ #Close All Connections
+ #Find And Reboot The Server ${stack_info} ${server_list} vfw_name_0
+ #Find And Reboot The Server ${stack_info} ${server_list} vpg_name_0
+ #Find And Reboot The Server ${stack_info} ${server_list} vsn_name_0
+ ## Gives some time for servers to shutdown
+ #Sleep 10s
+ #Wait For Server ${vfw_public_ip}
+ #Wait For Server ${vpg_public_ip}
+ #Wait For Server ${vsn_public_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 for Process on Host java .* -jar /opt/honeycomb/Honeycomb/vpp-integration/minimal-distribution/target/vpp-integration-distribution-1.16.9-hc/vpp-integration-distribution-1.16.9/vpp-integration-distribution-1.16.9.jar ${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/robot/resources/stack_validation/validate_vlb.robot b/robot/resources/stack_validation/validate_vlb.robot
new file mode 100644
index 00000000..9af768fa
--- /dev/null
+++ b/robot/resources/stack_validation/validate_vlb.robot
@@ -0,0 +1,60 @@
+*** Settings ***
+Documentation Testing openstack.
+Library String
+Library DNSUtils
+Library Collections
+Library SSHLibrary
+Resource validate_common.robot
+
+
+*** Variables ***
+${ASSETS} ${EXECDIR}/robot/assets/
+
+*** Keywords ***
+Validate vLB Stack
+ [Documentation] Identifies the LB and DNS servers in the vLB stack in the GLOBAL_OPENSTACK_SERVICE_REGION
+ [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
+
+ #${vpg_unprotected_ip}= Get From Dictionary ${stack_info} vpg_private_ip_0
+ #${vsn_protected_ip}= Get From Dictionary ${stack_info} vsn_private_ip_0
+ ${vlb_public_ip}= Get Server Ip ${server_list} ${stack_info} vlb_name_0 network_name=public
+ ##${vdns_public_ip}= Get Server Ip ${server_list} ${stack_info} vdns_name_0 network_name=public
+
+# SCript hands right here. Trying to figure out what it is....
+ #Wait For Server ${vlb_public_ip}
+ #Wait For Server ${vdns_public_ip}
+ #Log Accessed all servers
+
+
+ # Following is a hack because the stack doesn't always come up clean
+ # Give some time for VLB server to reconfigure the network so our script doesn't hang
+ Log Waiting for ${vlb_public_ip} to reconfigure
+ Sleep 180s
+ #${status} ${data}= Run Keyword And Ignore Error Wait For vLB ${vlb_public_ip}
+ #Return From Keyword if '${status}' == 'PASS'
+ #Close All Connections
+ #Find And Reboot The Server ${stack_info} ${server_list} vlb_name_0
+
+ # Give some time for VLB server to reconfigure the network so our script doesn't hang
+ #Log Waiting for ${vlb_public_ip} to reconfigure
+ #Sleep 180s
+ 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/robot/resources/stack_validation/validate_vvg.robot b/robot/resources/stack_validation/validate_vvg.robot
new file mode 100644
index 00000000..75340a47
--- /dev/null
+++ b/robot/resources/stack_validation/validate_vvg.robot
@@ -0,0 +1,17 @@
+*** Settings ***
+Documentation Testing openstack.
+Library String
+Library DNSUtils
+Library Collections
+Resource validate_common.robot
+
+
+*** Variables ***
+${ASSETS} ${EXECDIR}/robot/assets/
+
+*** Keywords ***
+Validate vVG Stack
+ [Documentation] Identifies the LB and DNS servers in the vLB stack in the GLOBAL_OPENSTACK_SERVICE_REGION
+ [Arguments] ${stack_name}
+ Log All server processes up
+