Initial checkin of EopenECOMP testsuite

Change-Id: I64a2b6d8cf66169829866b73b3d26a4ff59b0a42
Signed-off-by: DR695H <dr695h@att.com>
diff --git a/robot/resources/stack_validation/darkstat_interface.robot b/robot/resources/stack_validation/darkstat_interface.robot
new file mode 100644
index 0000000..3537408
--- /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 0000000..cc9ba04
--- /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 0000000..a1ed3fa
--- /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 0000000..eb7f9f5
--- /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 0000000..f63479e
--- /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 0000000..51f29b4
--- /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 0000000..9af768f
--- /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 0000000..75340a4
--- /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
+