CORD-2650 adding more functional tests to dataplane test and using control plane datafile

Change-Id: If2638486e54773017812079f38fd868663d328c3
(cherry picked from commit 9b31109c3cf0259a111c474103b904ff0980a9a9)
diff --git a/Jenkinsfile-ecord-global b/Jenkinsfile-ecord-global
index 431df57..8351f9d 100644
--- a/Jenkinsfile-ecord-global
+++ b/Jenkinsfile-ecord-global
@@ -63,15 +63,16 @@
         try {
             sh """
             if [ -d RobotLogs ]; then rm -r RobotLogs; fi; mkdir RobotLogs
+            mkdir RobotLogs/TestDoc || true
             scp -r ${deployment_config.head.user}@${deployment_config.head.ip}:/opt/cord/test/cord-tester/src/test/cord-api/Log/* ./RobotLogs || true
             scp -r ${deployment_config.head.user}@${deployment_config.head.ip}:/opt/cord/test/cord-tester/src/test/robot/Log/* ./RobotLogs || true
             scp -r ${deployment_config.head.user}@${deployment_config.head.ip}:/opt/cord/test/cord-tester/src/test/diag/Log/* ./RobotLogs || true
-            scp -r ${deployment_config.head.user}@${deployment_config.head.ip}:/opt/cord/test/cord-tester/src/test/diag/TestDoc/* ./RobotLogs/TestDocs || true
+            scp -r ${deployment_config.head.user}@${deployment_config.head.ip}:/opt/cord/test/cord-tester/src/test/diag/TestDoc/* ./RobotLogs/TestDoc || true
             """
             step([$class: 'RobotPublisher',
                 disableArchiveOutput: false,
                 logFileName: 'RobotLogs/log*.html',
-                otherFiles: 'RobotLogs/TestDocs/*.html',
+                otherFiles: 'RobotLogs/TestDoc/*.html',
                 outputFileName: 'RobotLogs/output*.xml',
                 outputPath: '.',
                 passThreshold: 100,
diff --git a/Jenkinsfile-ecord-local b/Jenkinsfile-ecord-local
index b2737d1..28ab7cb 100644
--- a/Jenkinsfile-ecord-local
+++ b/Jenkinsfile-ecord-local
@@ -90,17 +90,18 @@
         try {
             sh """
             if [ -d RobotLogs ]; then rm -r RobotLogs; fi; mkdir RobotLogs
+            mkdir RobotLogs/TestDoc || true
             scp -r ${deployment_config.head.user}@${deployment_config.head.ip}:/opt/cord/test/cord-tester/src/test/cord-api/Log/* ./RobotLogs || true
             scp -r ${deployment_config.head.user}@${deployment_config.head.ip}:/opt/cord/test/cord-tester/src/test/robot/Log/* ./RobotLogs || true
             scp -r ${deployment_config.head.user}@${deployment_config.head.ip}:/opt/cord/test/cord-tester/src/test/diag/Log/* ./RobotLogs || true
-            scp -r ${deployment_config.head.user}@${deployment_config.head.ip}:/opt/cord/test/cord-tester/src/test/robot/TestDoc/* ./RobotLogs/TestDocs || true
-            scp -r ${deployment_config.head.user}@${deployment_config.head.ip}:/opt/cord/test/cord-tester/src/test/diag/TestDoc/* ./RobotLogs/TestDocs || true
+            scp -r ${deployment_config.head.user}@${deployment_config.head.ip}:/opt/cord/test/cord-tester/src/test/robot/TestDoc/* ./RobotLogs/TestDoc || true
+            scp -r ${deployment_config.head.user}@${deployment_config.head.ip}:/opt/cord/test/cord-tester/src/test/diag/TestDoc/* ./RobotLogs/TestDoc || true
 
             """
             step([$class: 'RobotPublisher',
                 disableArchiveOutput: false,
                 logFileName: 'RobotLogs/log*.html',
-                otherFiles: 'RobotLogs/TestDocs/*.html',
+                otherFiles: 'RobotLogs/TestDoc/*.html',
                 outputFileName: 'RobotLogs/output*.xml',
                 outputPath: '.',
                 passThreshold: 100,
diff --git a/Jenkinsfile-mcord b/Jenkinsfile-mcord
index f336625..62a2d31 100644
--- a/Jenkinsfile-mcord
+++ b/Jenkinsfile-mcord
@@ -90,16 +90,17 @@
         try {
             sh """
             if [ -d RobotLogs ]; then rm -r RobotLogs; fi; mkdir RobotLogs
+            mkdir RobotLogs/TestDoc || true
             scp -r ${deployment_config.head.user}@${deployment_config.head.ip}:/opt/cord/test/cord-tester/src/test/cord-api/Log/* ./RobotLogs || true
             scp -r ${deployment_config.head.user}@${deployment_config.head.ip}:/opt/cord/test/cord-tester/src/test/robot/Log/* ./RobotLogs || true
             scp -r ${deployment_config.head.user}@${deployment_config.head.ip}:/opt/cord/test/cord-tester/src/test/diag/Log/* ./RobotLogs || true
-            scp -r ${deployment_config.head.user}@${deployment_config.head.ip}:/opt/cord/test/cord-tester/src/test/robot/TestDoc/* ./RobotLogs/TestDocs || true
-            scp -r ${deployment_config.head.user}@${deployment_config.head.ip}:/opt/cord/test/cord-tester/src/test/diag/TestDoc/* ./RobotLogs/TestDocs || true
+            scp -r ${deployment_config.head.user}@${deployment_config.head.ip}:/opt/cord/test/cord-tester/src/test/robot/TestDoc/* ./RobotLogs/TestDoc || true
+            scp -r ${deployment_config.head.user}@${deployment_config.head.ip}:/opt/cord/test/cord-tester/src/test/diag/TestDoc/* ./RobotLogs/TestDoc || true
             """
             step([$class: 'RobotPublisher',
                 disableArchiveOutput: false,
                 logFileName: 'RobotLogs/log*.html',
-                otherFiles: 'RobotLogs/TestDocs/*.html',
+                otherFiles: 'RobotLogs/TestDoc/*.html',
                 outputFileName: 'RobotLogs/output*.xml',
                 outputPath: '.',
                 passThreshold: 100,
diff --git a/Jenkinsfile-rcord b/Jenkinsfile-rcord
index 42817f0..48201ab 100644
--- a/Jenkinsfile-rcord
+++ b/Jenkinsfile-rcord
@@ -156,9 +156,7 @@
                 rm -r Log/ || true
                 rm -r TestDoc/ || true
                 mkdir TestDoc || true
-                ssh-agent bash
-                ssh-add
-                pybot -L TRACE -d Log -T vsg_dataplane_test.robot
+                pybot -L TRACE -v pod:${deployment_config.pod_config.file_name} -d Log -T vsg_dataplane_test.robot
                 python -m robot.testdoc vsg_dataplane_test.robot TestDoc/vsg_dataplane_test.html
                 """)
             } catch(error) { currentBuild.result = 'FAILURE' }
@@ -167,20 +165,21 @@
     stage('Publish') {
         try {
             sh """
-            if [ -d RobotLogs ]; then rm -r RobotLogs; fi; mkdir RobotLogs
+            if [ -d RobotLogs ]; then rm -r RobotLogs; fi; mkdir RobotLogs;
+            mkdir RobotLogs/TestDoc || true
             scp -r ${deployment_config.head.user}@${deployment_config.head.ip}:/opt/cord/test/cord-tester/src/test/cord-api/Log/* ./RobotLogs || true
             scp -r ${deployment_config.head.user}@${deployment_config.head.ip}:/opt/cord/test/cord-tester/src/test/robot/Log/* ./RobotLogs || true
             scp -r ${deployment_config.head.user}@${deployment_config.head.ip}:/opt/cord/test/cord-tester/src/test/diag/Log/* ./RobotLogs || true
             scp -r ${deployment_config.head.user}@${deployment_config.head.ip}:/opt/cord/test/cord-tester/src/test/vsg/Log/* ./RobotLogs || true
-            scp -r ${deployment_config.head.user}@${deployment_config.head.ip}:/opt/cord/test/cord-tester/src/test/cord-api/TestDoc/* ./RobotLogs/TestDocs || true
-            scp -r ${deployment_config.head.user}@${deployment_config.head.ip}:/opt/cord/test/cord-tester/src/test/robot/TestDoc/* ./RobotLogs/TestDocs || true
-            scp -r ${deployment_config.head.user}@${deployment_config.head.ip}:/opt/cord/test/cord-tester/src/test/diag/TestDoc/* ./RobotLogs/TestDocs || true
-            scp -r ${deployment_config.head.user}@${deployment_config.head.ip}:/opt/cord/test/cord-tester/src/test/vsg/TestDoc/* ./RobotLogs/TestDocs || true
+            scp -r ${deployment_config.head.user}@${deployment_config.head.ip}:/opt/cord/test/cord-tester/src/test/cord-api/TestDoc/* ./RobotLogs/TestDoc || true
+            scp -r ${deployment_config.head.user}@${deployment_config.head.ip}:/opt/cord/test/cord-tester/src/test/robot/TestDoc/* ./RobotLogs/TestDoc || true
+            scp -r ${deployment_config.head.user}@${deployment_config.head.ip}:/opt/cord/test/cord-tester/src/test/diag/TestDoc/* ./RobotLogs/TestDoc || true
+            scp -r ${deployment_config.head.user}@${deployment_config.head.ip}:/opt/cord/test/cord-tester/src/test/vsg/TestDoc/* ./RobotLogs/TestDoc || true
             """
             step([$class: 'RobotPublisher',
                 disableArchiveOutput: false,
                 logFileName: 'RobotLogs/log*.html',
-                otherFiles: 'RobotLogs/TestDocs/*.html',
+                otherFiles: 'RobotLogs/TestDoc/*.html',
                 outputFileName: 'RobotLogs/output*.xml',
                 outputPath: '.',
                 passThreshold: 100,
diff --git a/src/test/setup/calix_fabric_test_netcfg.json b/src/test/setup/calix_fabric_test_netcfg.json
new file mode 100644
index 0000000..de4defd
--- /dev/null
+++ b/src/test/setup/calix_fabric_test_netcfg.json
@@ -0,0 +1,92 @@
+{
+    "devices": {
+        "of:0000480fcfae6e0a": {
+            "segmentrouting": {
+                "name": "device-480fcfae6e0a",
+                "ipv4NodeSid": 100,
+                "ipv4Loopback": "10.6.0.102",
+                "routerMac": "48:0f:cf:ae:6e:0a",
+                "isEdgeRouter": false,
+                "adjacencySids": []
+            }
+        },
+        "of:0000480fcfaedea8": {
+            "segmentrouting": {
+                "name": "device-480fcfaedea8",
+                "ipv4NodeSid": 101,
+                "ipv4Loopback": "10.6.0.104",
+                "routerMac": "48:0f:cf:ae:de:a8",
+                "isEdgeRouter": true,
+                "adjacencySids": []
+            }
+        },
+        "of:0000480fcfae8e12": {
+            "segmentrouting": {
+                "name": "device-480fcfae8e12",
+                "ipv4NodeSid": 102,
+                "ipv4Loopback": "10.6.0.101",
+                "routerMac": "48:0f:cf:ae:8e:12",
+                "isEdgeRouter": false,
+                "adjacencySids": []
+            }
+        },
+        "of:0000480fcfaeeeac": {
+            "segmentrouting": {
+                "name": "device-480fcfaeeeac",
+                "ipv4NodeSid": 103,
+                "ipv4Loopback": "10.6.0.103",
+                "routerMac": "48:0f:cf:ae:ee:ac",
+                "isEdgeRouter": true,
+                "adjacencySids": []
+            }
+        }
+    },
+    "ports": {
+        "of:0000480fcfaedea8/2": {
+            "interfaces": [
+                {
+                    "ips": [ "10.6.2.254/24" ],
+                    "vlan-untagged" : 2
+                }
+            ]
+        },
+        "of:0000480fcfaedea8/1": {
+            "interfaces": [
+                {
+                    "ips": [ "10.6.2.254/24" ],
+                    "vlan-untagged" : 2
+                }
+            ]
+        },
+        "of:0000480fcfaeeeac/1": {
+            "interfaces": [
+                {
+                    "ips": [ "10.6.1.254/24" ],
+                    "vlan-untagged" : 1
+                }
+            ]
+        }
+    },
+    "apps" : {
+        "org.onosproject.segmentrouting" : {
+            "segmentrouting" : {
+                "vRouterMacs" : [ "a4:23:05:06:01:01" ]
+            },
+            "xconnect": {
+              "of:0000480fcfaedea8": [{
+                "vlan": 333,
+                "ports": [1, 2],
+                "name": "vsg-1"
+                },
+                {
+                "vlan": 555,
+                "ports": [1, 2],
+                "name": "vsg-2"},
+                {
+                "vlan": 666,
+                "ports": [1, 2],
+                "name": "vsg-3"}]
+           }
+        }
+    }
+}
\ No newline at end of file
diff --git a/src/test/setup/cord-test.py b/src/test/setup/cord-test.py
index 4838e49..e7f3f3a 100755
--- a/src/test/setup/cord-test.py
+++ b/src/test/setup/cord-test.py
@@ -1397,7 +1397,7 @@
     if args.onos_cord:
         #try restoring the onos cord instance
         try:
-            onos_cord = OnosCord(args.onos_ip, args.onos_cord, args.service_profile, args.synchronizer, start = False, skip = test_manifest.skip_onos_restart)
+            onos_cord = OnosCord(args.onos_ip, args.onos_cord, args.service_profile, args.synchronizer, start = False, skip = manifest.skip_onos_restart)
             onos_cord.restore(force = True)
         except Exception as e:
             print(e)
diff --git a/src/test/vsg/vsg_dataplane_test.robot b/src/test/vsg/vsg_dataplane_test.robot
index c57e795..1fb7ebb 100644
--- a/src/test/vsg/vsg_dataplane_test.robot
+++ b/src/test/vsg/vsg_dataplane_test.robot
@@ -13,7 +13,8 @@
 # limitations under the License.
 
 *** Settings ***
-Test Timeout      2 minutes
+Suite Setup       Setup
+Test Timeout      10 minutes
 Documentation     Validates external connectivity from Cord-Tester Container through VSG Subscriber
 Library           OperatingSystem
 Library           SSHLibrary
@@ -23,16 +24,42 @@
 Resource          /opt/cord/test/cord-tester/src/test/cord-api/Framework/utils/utils.robot
 
 *** Variables ***
-${netcfg_file}    qct_fabric_test_netcfg.json
+${pod}              qct-pod1.yml
+${vsg_data_file}    /opt/cord/test/cord-tester/src/test/cord-api/Tests/data/Ch_VoltTenant.json
 
 *** Test Cases ***
+Validate Instances are ACTIVE
+    [Documentation]    Validates that all instances are ACTIVE
+    Wait Until Keyword Succeeds    300s    5s    Instances ACTIVE
+
+Validate Connectivity to All VSGs via Mgmt Interface
+    [Documentation]    Validates that all given vsg instances are reachable through the mgmt interfaces
+    ##Loop through nova ids,  get mgmt ips + compute nodes, ssh into compute node, and validate ping to mgmt_ip
+    : FOR    ${nova_id}    IN    @{nova_ids}
+    \    ${mgmt_ip}=    Run    . /opt/cord_profile/admin-openrc.sh; nova show ${nova_id} | grep management | awk '{print $5}'
+    \    ${node}=    Run    . /opt/cord_profile/admin-openrc.sh; nova show ${nova_id} | grep :host | awk '{print $4}'
+    \    ${ping_result}=    Run    ssh ubuntu@${node} ping -c 1 ${mgmt_ip}
+    \    Should Contain   ${ping_result}    64 bytes from ${mgmt_ip}
+    \    Should Not Contain    ${ping_result}    100% packet loss
+
+Validate VSG External Connectivity
+    [Documentation]    Validates that the given vsg instances have external connectivity
+    : FOR    ${nova_id}    IN    @{nova_ids}
+    \    ${mgmt_ip}=    Run    . /opt/cord_profile/admin-openrc.sh; nova show ${nova_id} | grep management | awk '{print $5}'
+    \    ${node}=    Run    . /opt/cord_profile/admin-openrc.sh; nova show ${nova_id} | grep :host | awk '{print $4}'
+    \    Wait Until Keyword Succeeds    300s    5s    Validate Ext Connectivity    ${node}    ${mgmt_ip}
+
 Configure X-Connects for 3 Subscribers
-    [Documentation]    Configures the cross connect on the fabric switch with s-tags for the subscribers created via control-plane tests  on the correct ports
+    [Documentation]    Configures the cross connect on the fabric switch with s-tags for the subscribers created via control-plane tests on the correct ports
+    [Tags]    xconnect
     ${netcfg_init}=    onosUtils.onos_command_execute    onos-fabric    8101    netcfg
     Log    ${netcfg_init}
     Run    http -a onos:rocks DELETE http://onos-fabric:8181/onos/v1/network/configuration/
+    Sleep    5
     Run    http -a onos:rocks POST http://onos-fabric:8181/onos/v1/network/configuration/ < /opt/cord/test/cord-tester/src/test/setup/${netcfg_file}
+    Sleep    5
     Run    http -a onos:rocks DELETE http://onos-fabric:8181/onos/v1/applications/org.onosproject.segmentrouting/active
+    Sleep    5
     Run    http -a onos:rocks POST http://onos-fabric:8181/onos/v1/applications/org.onosproject.segmentrouting/active
     Sleep    5
     ${netcfg}=    onosUtils.onos_command_execute    onos-fabric    8101    netcfg
@@ -40,9 +67,23 @@
     Should Contain    ${netcfg}    vsg-1
     Should Contain    ${netcfg}    vsg-2
     Should Contain    ${netcfg}    vsg-3
-    Should Contain    ${netcfg}    "vlan" : 333
-    Should Contain    ${netcfg}    "vlan" : 555
-    Should Contain    ${netcfg}    "vlan" : 666
+    Should Contain    ${netcfg}    "vlan" : ${s_tags[0]}
+    Should Contain    ${netcfg}    "vlan" : ${s_tags[1]}
+    Should Contain    ${netcfg}    "vlan" : ${s_tags[2]}
+
+Validate VSG External Connectivity Again
+    [Documentation]    Validates that the given vsg instances have external connectivity even after onos-fabric has been re-configured
+    : FOR    ${nova_id}    IN    @{nova_ids}
+    \    ${mgmt_ip}=    Run    . /opt/cord_profile/admin-openrc.sh; nova show ${nova_id} | grep management | awk '{print $5}'
+    \    ${node}=    Run    . /opt/cord_profile/admin-openrc.sh; nova show ${nova_id} | grep :host | awk '{print $4}'
+    \    Wait Until Keyword Succeeds    300s    5s    Validate Ext Connectivity    ${node}    ${mgmt_ip}
+
+Validate VCPE Containers
+    [Documentation]    Validates that vcpes containers are up in each vsg instance
+    : FOR    ${nova_id}    IN    @{nova_ids}
+    \    ${mgmt_ip}=    Run    . /opt/cord_profile/admin-openrc.sh; nova show ${nova_id} | grep management | awk '{print $5}'
+    \    ${node}=    Run    . /opt/cord_profile/admin-openrc.sh; nova show ${nova_id} | grep :host | awk '{print $4}'
+    \    Wait Until Keyword Succeeds    800s    5s    Validate VCPE Container is Up    ${node}    ${mgmt_ip}
 
 Get VSG Subscriber and Tags
     [Documentation]    Retrieves compute node connected on leaf-1 and s/c tags for that particular subscriber
@@ -57,9 +98,7 @@
     \    Run Keyword If    '${node}' == '${cnode_on_leaf_1[0]}'    Exit For Loop
     ${mgmt_ip}=    Run    . /opt/cord_profile/admin-openrc.sh; nova show ${nova_id} | grep management | awk '{print $5}'
     ## Get s/c tags for vsg
-    Run    ssh-agent bash \r
-    Run    ssh-add
-    ${result}=    Run    ssh -A ubuntu@${cnode_on_leaf_1[0]} ssh ubuntu@${mgmt_ip} sudo docker ps | grep vsg- | awk '{print $10}'
+    ${result}=    Run    ssh -o ProxyCommand="ssh -W %h:%p -l ubuntu ${cnode_on_leaf_1[0]}" ubuntu@${mgmt_ip} "sudo docker ps|grep 'vsg\\|vcpe'" | awk '{print $10}'
     @{tags}=    Split String    ${result}    -
     ${s_tag}=    Set Variable    ${tags[1]}
     ${c_tag}=    Set Variable    ${tags[2]}
@@ -68,10 +107,11 @@
 
 Execute Dataplane Test
     [Documentation]    Configures interfaces on cord-tester container to connect to vsg instance and validates traffic
+    [Tags]    dataplane
     ${i_num}=    Set Variable If
-    ...    '${s_tag}' == '333'    1
-    ...    '${s_tag}' == '555'    2
-    ...    '${s_tag}' == '666'    3
+    ...    '${s_tag}' == '${s_tags[0]}'    1
+    ...    '${s_tag}' == '${s_tags[1]}'    2
+    ...    '${s_tag}' == '${s_tags[2]}'    3
     ${output}=    Run    docker exec cord-tester1 bash -c "sudo echo 'nameserver 192.168.0.1' > /etc/resolv.conf"
     ${output}=    Run    docker exec cord-tester1 bash -c "sudo dhclient vcpe${i_num}.${s_tag}.${c_tag}"
     Sleep    5
@@ -79,4 +119,56 @@
     ${output}=    Run    docker exec cord-tester1 bash -c "ping -c 3 -I vcpe${i_num}.${s_tag}.${c_tag} 8.8.8.8"
     Log To Console    \n ${output}
     Should Contain   ${output}    64 bytes from 8.8.8.8
-    Should Not Contain    ${output}    100% packet loss
\ No newline at end of file
+    Should Not Contain    ${output}    100% packet loss
+
+*** Keywords ***
+Setup
+    [Documentation]    Gets global vars for test suite
+    @{s_tags}=    Create List
+    @{c_tags}=    Create List
+    ${netcfg_file}=    Set Variable If
+    ...    '${pod}' == 'qct-pod1.yml'    qct_fabric_test_netcfg.json
+    ...    '${pod}' == 'flex-pod1.yml'    flex_fabric_test_netcfg.json
+    ...    '${pod}' == 'calix-pod1.yml'    calix_fabric_test_netcfg.json
+    Set Suite Variable    ${netcfg_file}
+    ${voltList} =    utils.jsonToList    ${vsg_data_file}    voltSubscriberInfo
+    Set Suite Variable    ${vlist}    ${voltList}
+    ${voltTenantList} =    Get Variable Value    ${vlist}
+    ${vsg_count}=    Get Length    ${vlist}
+    Set Suite Variable    ${vsg_count}
+    : FOR    ${INDEX}    IN RANGE    0    ${vsg_count}
+    \    ${voltTenantDict}=    utils.listToDict    ${voltTenantList}    ${INDEX}
+    \    ${voltDict}=    Get From Dictionary    ${voltTenantDict}    voltTenant
+    \    ${s_tag}=    Get From Dictionary    ${voltDict}    s_tag
+    \    ${c_tag}=    Get From Dictionary    ${voltDict}    c_tag
+    \    Append To List    ${s_tags}    ${s_tag}
+    \    Append To List    ${c_tags}    ${c_tag}
+    @{nova_ids}=    Wait Until Keyword Succeeds    120s    5s    Validate Number of VSGs    ${vsg_count}
+    Set Suite Variable    @{nova_ids}
+    Set Suite Variable    ${s_tags}
+    Set Suite Variable    ${c_tags}
+
+Validate Number of VSGs
+    [Arguments]    ${count}
+    ${novalist}=    Run    . /opt/cord_profile/admin-openrc.sh; nova list --all-tenants | awk '{print $2}' | grep '[a-z]'
+    Log    ${novalist}
+    @{nova_ids}=    Split To Lines    ${novalist}
+    ${vsgCount}=    Get Length    ${nova_ids}
+    Should Be Equal    ${vsgCount}    ${count}
+    [Return]    @{nova_ids}
+
+Instances ACTIVE
+    : FOR    ${nova_id}    IN    @{nova_ids}
+    \    ${status}=    Run    . /opt/cord_profile/admin-openrc.sh; nova show ${nova_id} | grep status | awk '{print $4}'
+    \    Should Be Equal    ${status}    ACTIVE
+
+Validate Ext Connectivity
+    [Arguments]    ${compute_node}    ${vsg_ip}
+    ${ping_ext_result}=    Run    ssh -o ProxyCommand="ssh -W %h:%p -l ubuntu ${compute_node}" ubuntu@${vsg_ip} "ping -c 3 8.8.8.8"
+    Should Contain   ${ping_ext_result}    64 bytes from 8.8.8.8
+    Should Not Contain    ${ping_ext_result}    100% packet loss
+
+Validate VCPE Container is Up
+    [Arguments]    ${compute_node}    ${vsg_ip}
+    ${docker_containers}=    Run    ssh -o ProxyCommand="ssh -W %h:%p -l ubuntu ${compute_node}" ubuntu@${vsg_ip} sudo docker ps | wc -l
+    Should Not Contain   ${docker_containers}    0
\ No newline at end of file