[VOL-3092] Validating flows in VOLTHA physical device

Change-Id: I8448159564aa96887476ba2bfa8030d55ff1891b
diff --git a/libraries/flows.robot b/libraries/flows.robot
index 678270a..8e15939 100644
--- a/libraries/flows.robot
+++ b/libraries/flows.robot
@@ -59,11 +59,11 @@
     ${flow_count}=  Run Keyword If  $provisioned=='false'
     ...     Evaluate    (${uni_count} * ${eapFlowsCount}) + (${olt_count} * 2)
     ...     ELSE
-    ...     Calculate Att Provisione Flows  ${olt_count}    ${uni_count}
+    ...     Calculate Att Provisioned Flows  ${olt_count}    ${uni_count}
     ...     ${eapFlowsCount}   ${dhcpFlowsCount}   ${igmpFlowsCount}
     Return From Keyword     ${flow_count}
 
-Calculate Att Provisione Flows
+Calculate Att Provisioned Flows
     [Documentation]  This calculate the flows for provisioned subscribers in the ATT workflow
     [Arguments]  ${olt_count}   ${uni_count}    ${eapFlowsCount}   ${dhcpFlowsCount}   ${igmpFlowsCount}
     ${eap}=     Evaluate    ${uni_count} * ${eapFlowsCount}
diff --git a/libraries/voltctl.robot b/libraries/voltctl.robot
index 0d51b0e..33f5247 100644
--- a/libraries/voltctl.robot
+++ b/libraries/voltctl.robot
@@ -142,6 +142,15 @@
     Log    ${devices}
     Should Be Equal As Integers    ${rc1}    0
 
+Get Device List from Voltha by type
+    [Documentation]    Gets Device List Output from Voltha applying filtering by device type
+    [Arguments]  ${type}
+    ${rc1}    ${devices}=    Run and Return Rc and Output
+    ...     ${VOLTCTL_CONFIG}; voltctl device list -f Type=${type} -o json
+    Log    ${devices}
+    Should Be Equal As Integers    ${rc1}    0
+    Return From Keyword     ${devices}
+
 Get Logical Device List from Voltha
     [Documentation]    Gets Logical Device List Output from Voltha (in json format)
     ${rc1}    ${devices}=    Run and Return Rc and Output    ${VOLTCTL_CONFIG}; voltctl logicaldevice list -o json
@@ -482,6 +491,9 @@
         Should Be Equal As Integers    ${rc}    0
         ${total_flows}=     Evaluate    ${total_flows} + ${flows}
     END
+    ${msg}=     Format String   Found {total_flows} flows of {targetFlows} expected
+    ...     total_flows=${total_flows}  targetFlows=${targetFlows}
+    Log     ${msg}
     Should Be Equal As Integers    ${targetFlows}    ${total_flows}
 
 Wait for Logical Devices flows
@@ -494,3 +506,30 @@
     # TODO extend Validate Logical Device Flows to check the correct number of flows
     Wait Until Keyword Succeeds     10m     5s  Count Logical Devices flows     ${targetFlows}
 
+Count OpenOLT Device Flows
+    [Documentation]  Count the flows across openolt devices in VOLTHA
+    [Arguments]  ${targetFlows}
+    ${output}=     Get Device List from Voltha by type      openolt
+    ${devices}=    To Json    ${output}
+    ${total_flows}=     Set Variable    0
+    FOR     ${device}   IN  @{devices}
+        ${rc}    ${flows}=    Run and Return Rc and Output
+        ...     ${VOLTCTL_CONFIG}; voltctl device flows ${device['id']} | grep -v ID | wc -l
+        Should Be Equal As Integers    ${rc}    0
+        ${total_flows}=     Evaluate    ${total_flows} + ${flows}
+    END
+    ${msg}=     Format String   Found {total_flows} flows of {targetFlows} expected
+    ...     total_flows=${total_flows}  targetFlows=${targetFlows}
+    Log     ${msg}
+    Should Be Equal As Integers    ${targetFlows}    ${total_flows}
+
+Wait for OpenOLT Devices flows
+    [Documentation]  Waits until the flows have been provisioned in the openolt devices
+    [Arguments]  ${workflow}    ${uni_count}    ${olt_count}    ${provisioned}
+    ...     ${withEapol}    ${withDhcp}     ${withIgmp}
+    ${targetFlows}=     Calculate flows by workflow     ${workflow}    ${uni_count}    ${olt_count}     ${provisioned}
+    ...     ${withEapol}    ${withDhcp}     ${withIgmp}
+    # In the physical device we only have 2 data plane flows (on the PON) instead of 4
+    ${targetFlows}=     Evaluate    ${targetFlows} - (${uni_count} * 2)
+    Log     ${targetFlows}
+    Wait Until Keyword Succeeds     10m     5s  Count OpenOLT Device Flows     ${targetFlows}
\ No newline at end of file